/*++

Copyright (c) 2006, Intel Corporation                                                         
All rights reserved. This program and the accompanying materials                          
are licensed and made available under the terms and conditions of the BSD License         
which accompanies this distribution.  The full text of the license may be found at        
http://opensource.org/licenses/bsd-license.php                                            
                                                                                          
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             

Module Name:

  language.c

Abstract:

 Language settings
  
Revision History

--*/

#include "String.h"
#include "Language.h"

#define NARROW_GLYPH_NUMBER 8
#define WIDE_GLYPH_NUMBER   75

//
// Default language code, currently is English
//
CHAR8 *mDefaultLangCode = "eng";

typedef struct {
  EFI_HII_FONT_PACK FixedLength;
  EFI_NARROW_GLYPH  NarrowArray[NARROW_GLYPH_NUMBER];
  EFI_WIDE_GLYPH    WideArray[WIDE_GLYPH_NUMBER];
} FONT_PACK;

FONT_PACK mFontPack = {
  {
    {
      sizeof (EFI_HII_FONT_PACK) + (NARROW_GLYPH_NUMBER * sizeof (EFI_NARROW_GLYPH)) + (WIDE_GLYPH_NUMBER * sizeof (EFI_WIDE_GLYPH)),
      EFI_HII_FONT
    },
    NARROW_GLYPH_NUMBER,
    WIDE_GLYPH_NUMBER
  },
  {     // Narrow Glyphs
    {
      0x05d0,
      0x00,
      {
        0x00,
        0x00,
        0x00,
        0x4E,
        0x6E,
        0x62,
        0x32,
        0x32,
        0x3C,
        0x68,
        0x4C,
        0x4C,
        0x46,
        0x76,
        0x72,
        0x00,
        0x00,
        0x00,
        0x00
      }
    },
    {
      0x05d1,
      0x00,
      {
        0x00,
        0x00,
        0x00,
        0x78,
        0x7C,
        0x0C,
        0x0C,
        0x0C,
        0x0C,
        0x0C,
        0x0C,
        0x0C,
        0x0C,
        0x7E,
        0x7E,
        0x00,
        0x00,
        0x00,
        0x00
      }
    },
    {
      0x05d2,
      0x00,
      {
        0x00,
        0x00,
        0x00,
        0x78,
        0x7C,
        0x0C,
        0x0C,
        0x0C,
        0x0C,
        0x0C,
        0x0C,
        0x1C,
        0x3E,
        0x66,
        0x66,
        0x00,
        0x00,
        0x00,
        0x00
      }
    },
    {
      0x05d3,
      0x00,
      {
        0x00,
        0x00,
        0x00,
        0x7E,
        0x7E,
        0x0C,
        0x0C,
        0x0C,
        0x0C,
        0x0C,
        0x0C,
        0x0C,
        0x0C,
        0x0C,
        0x0C,
        0x00,
        0x00,
        0x00,
        0x00
      }
    },
    {
      0x05d4,
      0x00,
      {
        0x00,
        0x00,
        0x00,
        0x7C,
        0x7E,
        0x06,
        0x06,
        0x06,
        0x06,
        0x66,
        0x66,
        0x66,
        0x66,
        0x66,
        0x66,
        0x00,
        0x00,
        0x00,
        0x00
      }
    },
    {
      0x05d5,
      0x00,
      {
        0x00,
        0x00,
        0x00,
        0x3C,
        0x3C,
        0x0C,
        0x0C,
        0x0C,
        0x0C,
        0x0C,
        0x0C,
        0x0C,
        0x0C,
        0x0C,
        0x0C,
        0x00,
        0x00,
        0x00,
        0x00
      }
    },
    {
      0x05d6,
      0x00,
      {
        0x00,
        0x00,
        0x00,
        0x38,
        0x38,
        0x1E,
        0x1E,
        0x18,
        0x18,
        0x18,
        0x18,
        0x18,
        0x18,
        0x18,
        0x18,
        0x00,
        0x00,
        0x00,
        0x00
      }
    },
    {
      0x0000,
      0x00,
      {
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00
      }
    }
  },
  {     // Wide Glyphs
    {
      0x0020,
      0x00,
      {
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00
      },
      {
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00
      },
      {
        0x00,
        0x00,
        0x00
      }
    },  //
  }
};

VOID
ExportFonts (
  VOID
  )
/*++

Routine Description:
  Routine to export glyphs to the HII database.  This is in addition to whatever is defined in the Graphics Console driver.

Arguments:
  None
            
Returns:

--*/
{
  EFI_HII_HANDLE    HiiHandle;
  EFI_HII_PACKAGES  *PackageList;

  PackageList = PreparePackages (1, NULL, &mFontPack);
  //
  // Register our Fonts into the global database
  //
  HiiHandle = 0;
  Hii->NewPack (Hii, PackageList, &HiiHandle);

  gBS->FreePool (PackageList);
}

VOID
InitializeLanguage (
  BOOLEAN LangCodesSettingRequired
  )
/*++

Routine Description:
  Determine the current language that will be used 
  based on language related EFI Variables

Arguments:
  LangCodesSettingRequired - If required to set LangCode variable
            
Returns:

--*/
{
  EFI_STATUS  Status;
  UINTN       Index;
  UINTN       Size;
  CHAR8       LangCode[ISO_639_2_ENTRY_SIZE];
  CHAR8       *LangCodes;
  CHAR16      *LanguageString;

  LanguageString  = NULL;
  LangCodes       = NULL;

  ExportFonts ();

  //
  // Collect the languages from what our current Language support is based on our VFR
  //
  Hii->GetPrimaryLanguages (Hii, gStringPackHandle, &LanguageString);

  LangCodes = AllocatePool (StrLen (LanguageString));
  ASSERT (LangCodes);

  //
  // Convert LanguageString from Unicode to EFI defined ASCII LangCodes
  //
  for (Index = 0; LanguageString[Index] != 0x0000; Index++) {
    LangCodes[Index] = (CHAR8) LanguageString[Index];
  }

  LangCodes[Index] = 0;

  if (LangCodesSettingRequired) {
    Status = gRT->SetVariable (
                    L"LangCodes",
                    &gEfiGlobalVariableGuid,
                    EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
                    AsciiStrLen (LangCodes),
                    LangCodes
                    );
  }
  //
  // Find current LangCode from Lang NV Variable
  //
  Size = ISO_639_2_ENTRY_SIZE;
  Status = gRT->GetVariable (
                  L"Lang",
                  &gEfiGlobalVariableGuid,
                  NULL,
                  &Size,
                  &LangCode
                  );

  if (!EFI_ERROR (Status)) {
    Status = EFI_NOT_FOUND;
    for (Index = 0; LangCodes[Index] != 0; Index += ISO_639_2_ENTRY_SIZE) {
      if (CompareMem (&LangCodes[Index], LangCode, ISO_639_2_ENTRY_SIZE) == 0) {
        Status = EFI_SUCCESS;
        break;
      }
    }
  }
  //
  // If we cannot get language code from Lang variable,
  // or LangCode cannot be found from language table,
  // set the mDefaultLangCode to Lang variable.
  //
  if (EFI_ERROR (Status)) {
    Status = gRT->SetVariable (
                    L"Lang",
                    &gEfiGlobalVariableGuid,
                    EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
                    ISO_639_2_ENTRY_SIZE,
                    mDefaultLangCode
                    );
  }

  if (LangCodes) {
    gBS->FreePool (LangCodes);
  }

  if (LanguageString != NULL) {
    gBS->FreePool (LanguageString);
  }

}
