-- CA110051.AM
--
--                             Grant of Unlimited Rights
--
--     Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
--     F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained 
--     unlimited rights in the software and documentation contained herein.
--     Unlimited rights are defined in DFAR 252.227-7013(a)(19).  By making 
--     this public release, the Government intends to confer upon all 
--     recipients unlimited rights  equal to those held by the Government.  
--     These rights include rights to use, duplicate, release or disclose the 
--     released technical data and computer software in whole or in part, in 
--     any manner and for any purpose whatsoever, and to have or permit others 
--     to do so.
--
--                                    DISCLAIMER
--
--     ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
--     DISCLOSED ARE AS IS.  THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED 
--     WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
--     SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE 
--     OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
--     PARTICULAR PURPOSE OF SAID MATERIAL.
--*
--
-- OBJECTIVE:
--      Check that entities and operations declared in a package can be used
--      in the private part of a child of a child of the package.
--
-- TEST DESCRIPTION:
--      Declare a series of library unit packages -- parent, child, and 
--      grandchild.  The grandchild package will have a private part.
--      From within the private part of the grandchild, make use of 
--      components declared in the parent and grandparent packages.
--
-- TEST FILES:
--      The test consists of the following files:
--
--         CA110050.A
--      => CA110051.AM
--
--
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--
--!

                                    -- Grandchild Package Message.Text.Encoded
package CA110050_0.CA110050_1.CA110050_2 is  

   type Coded_Message is new Text_Message_Type with private;

   procedure Send (Message : in     Coded_Message;
                   Confirm :    out Coded_Message;
                   Status  :    out Boolean);

   function Encode (Message : Text_Message_Type) return Coded_Message;
   function Decode (Message : Coded_Message)     return Boolean;
   function Test_Connection                      return Boolean;

private

   Uncoded : Descriptor renames Null_Descriptor_Value; -- Grandparent object.

   type Coded_Message is new Text_Message_Type with    -- Parent type.
      record
         Key       : Descriptor := Uncoded;
         Coded_Key : Descriptor := Next_Available_Message;
                                 -- Grandparent type, grandparent function.
         Scrambled : Text_Type  := Null_Text;          -- Parent object.
      end record;                                      

   Coded_Msg : Coded_Message;

   type Blank_Message is new Message_Type with         -- Grandparent type.
      record
         ID        : Descriptor := Next_Available_Message;
                                 -- Grandparent type, grandparent function.
      end record;                                      

   Test_Message     : Blank_Message;

   Confirm_String   : constant String := "OK";
   Scrambled_String : constant String := "KO";

   Confirm_Text : Text_Type (Confirm_String'Length) :=
     (Max_Length => Confirm_String'Length,
      Length     => Confirm_String'Length,
      Text_Field => Confirm_String);

   Scrambled_Text : Text_Type (Scrambled_String'Length) :=
     (Max_Length => Scrambled_String'Length,
      Length     => Scrambled_String'Length,
      Text_Field => Scrambled_String);
     
end CA110050_0.CA110050_1.CA110050_2; -- Grandchild Pkg Message.Text.Encoded

     --=================================================================--

                               -- Grandchild Package body Message.Text.Encoded
package body CA110050_0.CA110050_1.CA110050_2 is 

   procedure Send (Message : in     Coded_Message;
                   Confirm :    out Coded_Message;
                   Status  :    out Boolean) is

      Confirmation_Message : Coded_Message :=
        (Number    => Message.Number,
         Text      => Confirm_Text,
         Key       => Message.Number,
         Coded_Key => Message.Number,
         Scrambled => Scrambled_Text);  

   begin                                          -- Dummy processing unit.
      Confirm := Confirmation_Message;
      if Confirm.Number /= Null_Message_Descriptor then
         Status := True;                            
      else
         Status := False;
      end if;
   end Send;
   -------------------------------------------------------------------------
   function Encode (Message : Text_Message_Type)  return Coded_Message is
   begin
      Coded_Msg.Number       := Message.Number;
      if Message.Text.Length > 0 then
         Coded_Msg.Text      := Message.Text;     -- Record assignment.
         Coded_Msg.Key       := Message.Number;   -- Same as msg number.
         Coded_Msg.Coded_Key := Message.Number;   -- Same as msg number.
         Coded_Msg.Scrambled := Message.Text;     -- Dummy processing.
      end if;
      return (Coded_Msg);
   end Encode;
   -------------------------------------------------------------------------
   function Decode (Message : Coded_Message) return Boolean is
      Decoded : Boolean := False;
   begin                                                       
      if (Message.Text.Length = Confirm_String'Length)        and then
         (Message.Text.Text_Field = Confirm_String)           and then
         (Message.Scrambled.Length = Scrambled_String'Length) and then
         (Message.Scrambled.Text_Field = Scrambled_String)    and then
         (Message.Coded_Key = 15)
      then
         Decoded := True;
      end if;
      return (Decoded);
   end Decode;
   -------------------------------------------------------------------------
   function Test_Connection return Boolean is
   begin
      return Test_Message.Id = 10;
   end Test_Connection;

end CA110050_0.CA110050_1.CA110050_2;        
                               -- Grandchild Package body Message.Text.Encoded
 
     --=================================================================--

with CA110050_0.CA110050_1.CA110050_2; 
with Report;

procedure CA110051 is

   package Message_Package renames CA110050_0.CA110050_1;
   package Code_Package    renames CA110050_0.CA110050_1.CA110050_2; 

   Message_String : constant String := "One if by land, two if by sea";

   Message_Text   : Message_Package.Text_Type (Message_String'Length) := 
     (Max_Length => Message_String'Length,
      Length     => Message_String'Length,
      Text_Field => Message_String);

   Message : Message_Package.Text_Message_Type := 
     (Number => CA110050_0.Next_Available_Message,
      Text   => Message_Text);

   Confirmation_Message : Code_Package.Coded_Message;
   Verification_OK      : Boolean := False;
   Transmission_OK      : Boolean := False;

begin

-- This test simulates the use of child library unit packages to implement
-- a message encoding and transmission scheme.  The full capability of the
-- encoding and transmission mechanisms are not developed here, but the 
-- intent is to demonstrate that a grandchild library unit package with a
-- private part will provide the framework for this type of processing.

   Report.Test ("CA110051", "Check that entities and operations declared "  &
                            "in a package can be used in the private part " & 
                            "of a child of a child of the package");

                            -- The following code demonstrates the use
                            -- of functionality contained in a grandchild
                            -- library unit.  The grandchild unit made use
                            -- of components declared in the ancestor
                            -- packages.
   
   Code_Package.Send                            -- Message object declared
     (Message => Code_Package.Encode (Message), -- above in "encoded" by a
      Confirm => Confirmation_Message,          -- call to grandchild pkg
      Status  => Transmission_OK);              -- function call, reseting
                                                -- fields and returning a
                                                -- coded message to the
                                                -- parameter.  The confirm
                                                -- parameter receives an
                                                -- encoded message value
                                                -- from proc Send, which is 
                                                -- "decoded"/verified below.

   if not Code_Package.Test_Connection then
      Report.Failed ("Bad initialization");
   end if;

   Verification_OK := Code_Package.Decode (Confirmation_Message);

   if not (Transmission_OK and Verification_OK) then
      Report.Failed ("Message transmission failure");
   end if;

   Report.Result;

end CA110051;
