• R/O
  • SSH
  • HTTPS

id3v2editorplus: Commit


Commit MetaInfo

Revision33 (tree)
Zeit2019-09-27 04:29:04
Autorderekwildstar

Log Message

UClassesETipos.pas

Criada a classe helper TStreamHelper que contém uma propriedade para obter um texto unicode a partir da stream, a partir do ponto onde ela estiver
Ainda possui "erros marcadores"

Ändern Zusammenfassung

Diff

--- trunk/V2/src/UClassesETipos.pas (revision 32)
+++ trunk/V2/src/UClassesETipos.pas (revision 33)
@@ -66,6 +66,13 @@
6666 Texto: String;
6767 end;
6868
69+ TStreamHelper = class helper for TStream
70+ private
71+ function GetTextoUnicode: String;
72+ public
73+ property TextoUnicode: String read GetTextoUnicode;
74+ end;
75+
6976 TSYLTItem = class(TCollectionItem)
7077 private
7178 FCodificacaoDoTexto: Byte;
@@ -572,7 +579,7 @@
572579
573580 procedure TSYLTItem.AdicionarConteudo(AArquivo: TFileName);
574581 var
575- Header: array [0..9] of Byte;
582+ Header: PAnsiChar;
576583 Verso: TSYLTVerso;
577584 begin
578585 with TFileStream.Create(AArquivo,fmOpenRead or fmShareDenyWrite) do
@@ -579,21 +586,18 @@
579586 try
580587 Position := 0;
581588
582- Read(Header,10);
589+ Read(Header^,10);
583590
584- // Valide o header aqui!
591+ if Header <> 'Iv2EP!SYLT' then
592+ raise Exception.Create('Arquivo SYLT inválido');
585593
586594 while Position < Size do
587595 begin
588596 Read(Verso.Tempo,SizeOf(Cardinal));
589- a partir daqui, leia dois em dois bytes até que ache dois zeros, indicando que todos os bytes unicode foram lidos
590-
591-// Read(PWideChar(Verso.Texto)^,10);
592-
593-
597+ Verso.Texto := TextoUnicode;
598+ carregue todos os elementos do sylt incluindo sua descricao
599+ FConteudo.Add(Verso);
594600 end;
595-
596-
597601 finally
598602 Free;
599603 end;
@@ -849,9 +853,21 @@
849853 if ACaixaDeDialogoParaSalvarLetra.Execute then
850854 with TFileStream.Create(ACaixaDeDialogoParaSalvarLetra.FileName,fmCreate or fmShareDenyWrite) do
851855 try
852- var Header: AnsiString := 'Iv2EP!SYLT';
853- Write(PAnsiChar(Header)^,Length(Header));
856+ // Cabeçalho do arquivo
857+ Write(PAnsiChar('Iv2EP!SYLT')^,10);
854858
859+ // Descrição
860+ Write(PWideChar(Items[FIndice].Descricao)^, (Length(Items[FIndice].FDescricao) + 1) * 2);
861+
862+ // Idioma
863+ Write(Items[FIndice].Idioma, 3);
864+
865+ // Formato do rótulo de tempo
866+ Write(Items[FIndice].FormatoDoRotuloDeTempo, 1);
867+
868+ // Tipo de conteúdo
869+ Write(Items[FIndice].TipoDeConteudo, 1);
870+
855871 for var Verso: TSYLTVerso in Items[FIndice].Conteudo do
856872 begin
857873 Write(Verso.Tempo,SizeOf(Cardinal));
@@ -902,4 +918,77 @@
902918 FSYLT.ExibirVerso(BASSTempoDecorridoEmMilissegundos);
903919 end;
904920
921+{ TStreamHelper }
922+
923+function TStreamHelper.GetTextoUnicode: String;
924+var
925+ Byte1: Byte;
926+ Byte2: Byte;
927+begin
928+ Result := '';
929+
930+ if Position < Size then
931+ repeat
932+ Read(Byte1,1);
933+ Read(Byte2,1);
934+
935+ if (Byte1 <> $FF) and (Byte2 <> $FE) and ((Byte1 + Byte2) <> 0) then
936+ // Parece errado, mas a ordem dos bytes na memória é little endian,
937+ // enquanto que no arquivo a ordem é big endian (ordem de leitura)
938+ Result := Result + Char(Byte2 shl 8 or Byte1);
939+ until ((Byte1 + Byte2) = 0) or (Position = Size);
940+
941+
942+
943+
944+
945+
946+
947+
948+// repeat
949+// // AIndiceInicial aponta para o primeiro caractere do BOM, logo, é
950+// // necessário incrementar em dois a variável para que ela aponte para o
951+// // primeiro caractere da string
952+// Inc(AIndiceInicial,2);
953+//
954+// i := AIndiceInicial;
955+//
956+// // O loop varre o array de dois em dois e só para quando encontra 2 zeros
957+// // consecutivos, que é o terminador unicode. O loop também termina, claro,
958+// // quando não existem mais dados a serem lidos
959+// while (ABytes[i] + ABytes[Succ(i)] <> 0) and (i < Length(ABytes)) do
960+// Inc(i,2);
961+//
962+// // No fim do loop anterior, i estará apontando para o primeiro zero do par
963+// // de zeros que termina a string UNICODE. De AIndiceInicial até i -
964+// // AIndiceInicial está o texto do que eu chamo de verso.
965+// Verso.Texto := TEncoding.Unicode.GetString(ABytes,AIndiceInicial,i - AIndiceInicial);
966+//
967+// // Como dito anteriormente, i está apontando para o terminador UNICODE,
968+// // logo, i + 2 apontará para o primeiro dos 4 Bytes que representam o tempo
969+// Inc(i,2);
970+//
971+// // Obtendo o tempo a partir da posição indicada em i
972+// Verso.Tempo := SwapEndian32(PDWORD(@ABytes[i])^);
973+//
974+// // Adiciona o verso ao conteúdo
975+// FConteudo.Add(Verso);
976+//
977+// // Ao incrementar i em 4, nos posicionamos exatamente no final do item SYLT
978+// // e consequentemente no início do próximo
979+// Inc(i,4);
980+//
981+// // Configura AIndiceInical como sendo i, para que o loop possa retornar ao
982+// // início usando o mesmo algorítmo
983+// AIndiceInicial := i;
984+// until i > High(ABytes);
985+
986+
987+
988+
989+
990+
991+
992+end;
993+
905994 end.
Show on old repository browser