+ def OpenUniFile(self, FileName):\r
+ #\r
+ # Read file\r
+ #\r
+ try:\r
+ UniFile = open(FileName, mode='rb')\r
+ FileIn = UniFile.read()\r
+ UniFile.close()\r
+ except:\r
+ EdkLogger.Error("build", FILE_OPEN_FAILURE, ExtraData=File)\r
+\r
+ #\r
+ # We currently only support UTF-16\r
+ #\r
+ Encoding = 'utf-16'\r
+\r
+ self.VerifyUcs2Data(FileIn, FileName, Encoding)\r
+\r
+ UniFile = StringIO.StringIO(FileIn)\r
+ Info = codecs.lookup(Encoding)\r
+ (Reader, Writer) = (Info.streamreader, Info.streamwriter)\r
+ return codecs.StreamReaderWriter(UniFile, Reader, Writer)\r
+\r
+ def VerifyUcs2Data(self, FileIn, FileName, Encoding):\r
+ Ucs2Info = codecs.lookup('ucs-2')\r
+ #\r
+ # Convert to unicode\r
+ #\r
+ try:\r
+ FileDecoded = codecs.decode(FileIn, Encoding)\r
+ Ucs2Info.encode(FileDecoded)\r
+ except:\r
+ UniFile = StringIO.StringIO(FileIn)\r
+ Info = codecs.lookup(Encoding)\r
+ (Reader, Writer) = (Info.streamreader, Info.streamwriter)\r
+ File = codecs.StreamReaderWriter(UniFile, Reader, Writer)\r
+ LineNumber = 0\r
+ ErrMsg = lambda Encoding, LineNumber: \\r
+ '%s contains invalid %s characters on line %d.' % \\r
+ (FileName, Encoding, LineNumber)\r
+ while True:\r
+ LineNumber = LineNumber + 1\r
+ try:\r
+ Line = File.readline()\r
+ if Line == '':\r
+ EdkLogger.error('Unicode File Parser', PARSER_ERROR,\r
+ ErrMsg(Encoding, LineNumber))\r
+ Ucs2Info.encode(Line)\r
+ except:\r
+ EdkLogger.error('Unicode File Parser', PARSER_ERROR,\r
+ ErrMsg('UCS-2', LineNumber))\r
+\r