11static bool IsAnsiEscComment (const wchar *Data,size_t Size);
22
3- bool Archive::GetComment (Array<wchar> * CmtData)
3+ bool Archive::GetComment (std::wstring & CmtData)
44{
55 if (!MainComment)
66 return false ;
@@ -11,7 +11,7 @@ bool Archive::GetComment(Array<wchar> *CmtData)
1111}
1212
1313
14- bool Archive::DoGetComment (Array<wchar> * CmtData)
14+ bool Archive::DoGetComment (std::wstring & CmtData)
1515{
1616#ifndef SFX_MODULE
1717 uint CmtLength;
@@ -36,7 +36,12 @@ bool Archive::DoGetComment(Array<wchar> *CmtData)
3636 {
3737 // Current (RAR 3.0+) version of archive comment.
3838 Seek (GetStartPos (),SEEK_SET);
39- return SearchSubBlock (SUBHEAD_TYPE_CMT)!=0 && ReadCommentData (CmtData);
39+ if (SearchSubBlock (SUBHEAD_TYPE_CMT)!=0 )
40+ if (ReadCommentData (CmtData))
41+ return true ;
42+ else
43+ uiMsg (UIERROR_CMTBROKEN,FileName);
44+ return false ;
4045 }
4146#ifndef SFX_MODULE
4247 // Old style (RAR 2.9) comment header embedded into the main
@@ -101,67 +106,63 @@ bool Archive::DoGetComment(Array<wchar> *CmtData)
101106 // 4x memory for OEM to UTF-8 output here.
102107 OemToCharBuffA ((char *)UnpData,(char *)UnpData,(DWORD)UnpDataSize);
103108#endif
104- CmtData->Alloc (UnpDataSize+1 );
105- memset (CmtData->Addr (0 ),0 ,CmtData->Size ()*sizeof (wchar));
106- CharToWide ((char *)UnpData,CmtData->Addr (0 ),CmtData->Size ());
107- CmtData->Alloc (wcslen (CmtData->Addr (0 )));
109+ std::string UnpStr ((char *)UnpData,UnpDataSize);
110+ CharToWide (UnpStr,CmtData);
108111 }
109112 }
110113 }
111114 else
112115 {
113116 if (CmtLength==0 )
114117 return false ;
115- Array <byte> CmtRaw (CmtLength);
116- int ReadSize=Read (& CmtRaw[ 0 ] ,CmtLength);
118+ std::vector <byte> CmtRaw (CmtLength);
119+ int ReadSize=Read (CmtRaw. data () ,CmtLength);
117120 if (ReadSize>=0 && (uint)ReadSize<CmtLength) // Comment is shorter than declared.
118121 {
119122 CmtLength=ReadSize;
120- CmtRaw.Alloc (CmtLength);
123+ CmtRaw.resize (CmtLength);
121124 }
122125
123126 if (Format!=RARFMT14 && CommHead.CommCRC !=(~CRC32 (0xffffffff ,&CmtRaw[0 ],CmtLength)&0xffff ))
124127 {
125128 uiMsg (UIERROR_CMTBROKEN,FileName);
126129 return false ;
127130 }
128- CmtData-> Alloc (CmtLength+1 );
129- CmtRaw.Push (0 );
131+ // CmtData.resize (CmtLength+1);
132+ CmtRaw.push_back (0 );
130133#ifdef _WIN_ALL
131134 // If we ever decide to extend it to Android, we'll need to alloc
132135 // 4x memory for OEM to UTF-8 output here.
133- OemToCharA ((char *)& CmtRaw[ 0 ] ,(char *)& CmtRaw[ 0 ] );
136+ OemToCharA ((char *)CmtRaw. data () ,(char *)CmtRaw. data () );
134137#endif
135- CharToWide ((char *)& CmtRaw[ 0 ],CmtData-> Addr ( 0 ),CmtData-> Size () );
136- CmtData->Alloc (wcslen (CmtData->Addr ( 0 )));
138+ CharToWide ((const char *)CmtRaw. data ( ),CmtData);
139+ // CmtData->resize (wcslen(CmtData->data( )));
137140 }
138141#endif
139- return CmtData-> Size () > 0 ;
142+ return CmtData. size () > 0 ;
140143}
141144
142145
143- bool Archive::ReadCommentData (Array<wchar> * CmtData)
146+ bool Archive::ReadCommentData (std::wstring & CmtData)
144147{
145- Array <byte> CmtRaw;
148+ std::vector <byte> CmtRaw;
146149 if (!ReadSubData (&CmtRaw,NULL ,false ))
147150 return false ;
148- size_t CmtSize=CmtRaw.Size ();
149- CmtRaw.Push (0 );
150- CmtData->Alloc (CmtSize+1 );
151+ size_t CmtSize=CmtRaw.size ();
152+ CmtRaw.push_back (0 );
153+ // CmtData->resize (CmtSize+1);
151154 if (Format==RARFMT50)
152- UtfToWide ((char *)& CmtRaw[ 0 ],CmtData-> Addr ( 0 ),CmtData-> Size () );
155+ UtfToWide ((char *)CmtRaw. data ( ),CmtData);
153156 else
154157 if ((SubHead.SubFlags & SUBHEAD_FLAGS_CMT_UNICODE)!=0 )
155158 {
156- RawToWide (&CmtRaw[0 ],CmtData->Addr (0 ),CmtSize/2 );
157- (*CmtData)[CmtSize/2 ]=0 ;
158-
159+ CmtData=RawToWide (CmtRaw);
159160 }
160161 else
161162 {
162- CharToWide ((char *)& CmtRaw[ 0 ],CmtData-> Addr ( 0 ),CmtData-> Size () );
163+ CharToWide ((const char *)CmtRaw. data ( ),CmtData);
163164 }
164- CmtData->Alloc (wcslen (CmtData->Addr ( 0 ))); // Set buffer size to actual comment length.
165+ // CmtData->resize (wcslen(CmtData->data( ))); // Set buffer size to actual comment length.
165166 return true ;
166167}
167168
@@ -170,15 +171,16 @@ void Archive::ViewComment()
170171{
171172 if (Cmd->DisableComment )
172173 return ;
173- Array<wchar> CmtBuf;
174- if (GetComment (& CmtBuf)) // In GUI too, so "Test" command detects broken comments.
174+ std::wstring CmtBuf;
175+ if (GetComment (CmtBuf)) // In GUI too, so "Test" command detects broken comments.
175176 {
176- size_t CmtSize=CmtBuf.Size ();
177- wchar *ChPtr=wcschr (&CmtBuf[0 ],0x1A );
178- if (ChPtr!=NULL )
179- CmtSize=ChPtr-&CmtBuf[0 ];
180- mprintf (L" \n " );
181- OutComment (&CmtBuf[0 ],CmtSize);
177+ size_t CmtSize=CmtBuf.size ();
178+ auto EndPos=CmtBuf.find (0x1A );
179+ if (EndPos!=std::wstring::npos)
180+ CmtSize=EndPos;
181+ mprintf (St (MArcComment));
182+ mprintf (L" :\n " );
183+ OutComment (CmtBuf);
182184 }
183185}
184186
0 commit comments