xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Far/ExtractEngine.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // ExtractEngine.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ST
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Synchronization.h"
7*f6dc9357SAndroid Build Coastguard Worker #endif
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker #include "ExtractEngine.h"
12*f6dc9357SAndroid Build Coastguard Worker #include "FarUtils.h"
13*f6dc9357SAndroid Build Coastguard Worker #include "Messages.h"
14*f6dc9357SAndroid Build Coastguard Worker #include "OverwriteDialogFar.h"
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
17*f6dc9357SAndroid Build Coastguard Worker using namespace NFar;
18*f6dc9357SAndroid Build Coastguard Worker 
19*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ST
20*f6dc9357SAndroid Build Coastguard Worker static NSynchronization::CCriticalSection g_CriticalSection;
21*f6dc9357SAndroid Build Coastguard Worker #define MT_LOCK NSynchronization::CCriticalSectionLock lock(g_CriticalSection);
22*f6dc9357SAndroid Build Coastguard Worker #else
23*f6dc9357SAndroid Build Coastguard Worker #define MT_LOCK
24*f6dc9357SAndroid Build Coastguard Worker #endif
25*f6dc9357SAndroid Build Coastguard Worker 
26*f6dc9357SAndroid Build Coastguard Worker 
CheckBreak2()27*f6dc9357SAndroid Build Coastguard Worker static HRESULT CheckBreak2()
28*f6dc9357SAndroid Build Coastguard Worker {
29*f6dc9357SAndroid Build Coastguard Worker   return WasEscPressed() ? E_ABORT : S_OK;
30*f6dc9357SAndroid Build Coastguard Worker }
31*f6dc9357SAndroid Build Coastguard Worker 
32*f6dc9357SAndroid Build Coastguard Worker extern void PrintMessage(const char *message);
33*f6dc9357SAndroid Build Coastguard Worker 
Init(UINT codePage,CProgressBox * progressBox,bool passwordIsDefined,const UString & password)34*f6dc9357SAndroid Build Coastguard Worker void CExtractCallbackImp::Init(
35*f6dc9357SAndroid Build Coastguard Worker     UINT codePage,
36*f6dc9357SAndroid Build Coastguard Worker     CProgressBox *progressBox,
37*f6dc9357SAndroid Build Coastguard Worker     bool passwordIsDefined,
38*f6dc9357SAndroid Build Coastguard Worker     const UString &password)
39*f6dc9357SAndroid Build Coastguard Worker {
40*f6dc9357SAndroid Build Coastguard Worker   m_PasswordIsDefined = passwordIsDefined;
41*f6dc9357SAndroid Build Coastguard Worker   m_Password = password;
42*f6dc9357SAndroid Build Coastguard Worker   m_CodePage = codePage;
43*f6dc9357SAndroid Build Coastguard Worker   _percent = progressBox;
44*f6dc9357SAndroid Build Coastguard Worker }
45*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CExtractCallbackImp::SetTotal (UInt64 size))46*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CExtractCallbackImp::SetTotal(UInt64 size))
47*f6dc9357SAndroid Build Coastguard Worker {
48*f6dc9357SAndroid Build Coastguard Worker   MT_LOCK
49*f6dc9357SAndroid Build Coastguard Worker 
50*f6dc9357SAndroid Build Coastguard Worker   if (_percent)
51*f6dc9357SAndroid Build Coastguard Worker   {
52*f6dc9357SAndroid Build Coastguard Worker     _percent->Total = size;
53*f6dc9357SAndroid Build Coastguard Worker     _percent->Print();
54*f6dc9357SAndroid Build Coastguard Worker   }
55*f6dc9357SAndroid Build Coastguard Worker   return CheckBreak2();
56*f6dc9357SAndroid Build Coastguard Worker }
57*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CExtractCallbackImp::SetCompleted (const UInt64 * completeValue))58*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CExtractCallbackImp::SetCompleted(const UInt64 *completeValue))
59*f6dc9357SAndroid Build Coastguard Worker {
60*f6dc9357SAndroid Build Coastguard Worker   MT_LOCK
61*f6dc9357SAndroid Build Coastguard Worker 
62*f6dc9357SAndroid Build Coastguard Worker   if (_percent)
63*f6dc9357SAndroid Build Coastguard Worker   {
64*f6dc9357SAndroid Build Coastguard Worker     if (completeValue)
65*f6dc9357SAndroid Build Coastguard Worker       _percent->Completed = *completeValue;
66*f6dc9357SAndroid Build Coastguard Worker     _percent->Print();
67*f6dc9357SAndroid Build Coastguard Worker   }
68*f6dc9357SAndroid Build Coastguard Worker   return CheckBreak2();
69*f6dc9357SAndroid Build Coastguard Worker }
70*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CExtractCallbackImp::AskOverwrite (const wchar_t * existName,const FILETIME * existTime,const UInt64 * existSize,const wchar_t * newName,const FILETIME * newTime,const UInt64 * newSize,Int32 * answer))71*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CExtractCallbackImp::AskOverwrite(
72*f6dc9357SAndroid Build Coastguard Worker     const wchar_t *existName, const FILETIME *existTime, const UInt64 *existSize,
73*f6dc9357SAndroid Build Coastguard Worker     const wchar_t *newName, const FILETIME *newTime, const UInt64 *newSize,
74*f6dc9357SAndroid Build Coastguard Worker     Int32 *answer))
75*f6dc9357SAndroid Build Coastguard Worker {
76*f6dc9357SAndroid Build Coastguard Worker   MT_LOCK
77*f6dc9357SAndroid Build Coastguard Worker 
78*f6dc9357SAndroid Build Coastguard Worker   NOverwriteDialog::CFileInfo oldFileInfo, newFileInfo;
79*f6dc9357SAndroid Build Coastguard Worker   oldFileInfo.TimeIsDefined = (existTime != NULL);
80*f6dc9357SAndroid Build Coastguard Worker   if (oldFileInfo.TimeIsDefined)
81*f6dc9357SAndroid Build Coastguard Worker     oldFileInfo.Time = *existTime;
82*f6dc9357SAndroid Build Coastguard Worker   oldFileInfo.SizeIsDefined = (existSize != NULL);
83*f6dc9357SAndroid Build Coastguard Worker   if (oldFileInfo.SizeIsDefined)
84*f6dc9357SAndroid Build Coastguard Worker     oldFileInfo.Size = *existSize;
85*f6dc9357SAndroid Build Coastguard Worker   oldFileInfo.Name = existName;
86*f6dc9357SAndroid Build Coastguard Worker 
87*f6dc9357SAndroid Build Coastguard Worker   newFileInfo.TimeIsDefined = (newTime != NULL);
88*f6dc9357SAndroid Build Coastguard Worker   if (newFileInfo.TimeIsDefined)
89*f6dc9357SAndroid Build Coastguard Worker     newFileInfo.Time = *newTime;
90*f6dc9357SAndroid Build Coastguard Worker   newFileInfo.SizeIsDefined = (newSize != NULL);
91*f6dc9357SAndroid Build Coastguard Worker   if (newFileInfo.SizeIsDefined)
92*f6dc9357SAndroid Build Coastguard Worker     newFileInfo.Size = *newSize;
93*f6dc9357SAndroid Build Coastguard Worker   newFileInfo.Name = newName;
94*f6dc9357SAndroid Build Coastguard Worker 
95*f6dc9357SAndroid Build Coastguard Worker   NOverwriteDialog::NResult::EEnum result =
96*f6dc9357SAndroid Build Coastguard Worker     NOverwriteDialog::Execute(oldFileInfo, newFileInfo);
97*f6dc9357SAndroid Build Coastguard Worker 
98*f6dc9357SAndroid Build Coastguard Worker   switch ((int)result)
99*f6dc9357SAndroid Build Coastguard Worker   {
100*f6dc9357SAndroid Build Coastguard Worker   case NOverwriteDialog::NResult::kCancel:
101*f6dc9357SAndroid Build Coastguard Worker     // *answer = NOverwriteAnswer::kCancel;
102*f6dc9357SAndroid Build Coastguard Worker     // break;
103*f6dc9357SAndroid Build Coastguard Worker     return E_ABORT;
104*f6dc9357SAndroid Build Coastguard Worker   case NOverwriteDialog::NResult::kNo:
105*f6dc9357SAndroid Build Coastguard Worker     *answer = NOverwriteAnswer::kNo;
106*f6dc9357SAndroid Build Coastguard Worker     break;
107*f6dc9357SAndroid Build Coastguard Worker   case NOverwriteDialog::NResult::kNoToAll:
108*f6dc9357SAndroid Build Coastguard Worker     *answer = NOverwriteAnswer::kNoToAll;
109*f6dc9357SAndroid Build Coastguard Worker     break;
110*f6dc9357SAndroid Build Coastguard Worker   case NOverwriteDialog::NResult::kYesToAll:
111*f6dc9357SAndroid Build Coastguard Worker     *answer = NOverwriteAnswer::kYesToAll;
112*f6dc9357SAndroid Build Coastguard Worker     break;
113*f6dc9357SAndroid Build Coastguard Worker   case NOverwriteDialog::NResult::kYes:
114*f6dc9357SAndroid Build Coastguard Worker     *answer = NOverwriteAnswer::kYes;
115*f6dc9357SAndroid Build Coastguard Worker     break;
116*f6dc9357SAndroid Build Coastguard Worker   case NOverwriteDialog::NResult::kAutoRename:
117*f6dc9357SAndroid Build Coastguard Worker     *answer = NOverwriteAnswer::kAutoRename;
118*f6dc9357SAndroid Build Coastguard Worker     break;
119*f6dc9357SAndroid Build Coastguard Worker   default:
120*f6dc9357SAndroid Build Coastguard Worker     return E_FAIL;
121*f6dc9357SAndroid Build Coastguard Worker   }
122*f6dc9357SAndroid Build Coastguard Worker 
123*f6dc9357SAndroid Build Coastguard Worker   return CheckBreak2();
124*f6dc9357SAndroid Build Coastguard Worker }
125*f6dc9357SAndroid Build Coastguard Worker 
126*f6dc9357SAndroid Build Coastguard Worker static const char * const kTestString    =  "Testing";
127*f6dc9357SAndroid Build Coastguard Worker static const char * const kExtractString =  "Extracting";
128*f6dc9357SAndroid Build Coastguard Worker static const char * const kSkipString    =  "Skipping";
129*f6dc9357SAndroid Build Coastguard Worker static const char * const kReadString    =  "Reading";
130*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CExtractCallbackImp::PrepareOperation (const wchar_t * name,Int32,Int32 askExtractMode,const UInt64 *))131*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CExtractCallbackImp::PrepareOperation(const wchar_t *name, Int32 /* isFolder */, Int32 askExtractMode, const UInt64 * /* position */))
132*f6dc9357SAndroid Build Coastguard Worker {
133*f6dc9357SAndroid Build Coastguard Worker   MT_LOCK
134*f6dc9357SAndroid Build Coastguard Worker 
135*f6dc9357SAndroid Build Coastguard Worker   m_CurrentFilePath = name;
136*f6dc9357SAndroid Build Coastguard Worker   const char *s;
137*f6dc9357SAndroid Build Coastguard Worker 
138*f6dc9357SAndroid Build Coastguard Worker   switch (askExtractMode)
139*f6dc9357SAndroid Build Coastguard Worker   {
140*f6dc9357SAndroid Build Coastguard Worker     case NArchive::NExtract::NAskMode::kExtract: s = kExtractString; break;
141*f6dc9357SAndroid Build Coastguard Worker     case NArchive::NExtract::NAskMode::kTest:    s = kTestString; break;
142*f6dc9357SAndroid Build Coastguard Worker     case NArchive::NExtract::NAskMode::kSkip:    s = kSkipString; break;
143*f6dc9357SAndroid Build Coastguard Worker     case NArchive::NExtract::NAskMode::kReadExternal: s = kReadString; break;
144*f6dc9357SAndroid Build Coastguard Worker     default: s = "???"; // return E_FAIL;
145*f6dc9357SAndroid Build Coastguard Worker   }
146*f6dc9357SAndroid Build Coastguard Worker 
147*f6dc9357SAndroid Build Coastguard Worker   if (_percent)
148*f6dc9357SAndroid Build Coastguard Worker   {
149*f6dc9357SAndroid Build Coastguard Worker     _percent->Command = s;
150*f6dc9357SAndroid Build Coastguard Worker     _percent->FileName = name;
151*f6dc9357SAndroid Build Coastguard Worker     _percent->Print();
152*f6dc9357SAndroid Build Coastguard Worker   }
153*f6dc9357SAndroid Build Coastguard Worker 
154*f6dc9357SAndroid Build Coastguard Worker   return CheckBreak2();
155*f6dc9357SAndroid Build Coastguard Worker }
156*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CExtractCallbackImp::MessageError (const wchar_t * message))157*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CExtractCallbackImp::MessageError(const wchar_t *message))
158*f6dc9357SAndroid Build Coastguard Worker {
159*f6dc9357SAndroid Build Coastguard Worker   MT_LOCK
160*f6dc9357SAndroid Build Coastguard Worker 
161*f6dc9357SAndroid Build Coastguard Worker   AString s (UnicodeStringToMultiByte(message, CP_OEMCP));
162*f6dc9357SAndroid Build Coastguard Worker   if (g_StartupInfo.ShowErrorMessage((const char *)s) == -1)
163*f6dc9357SAndroid Build Coastguard Worker     return E_ABORT;
164*f6dc9357SAndroid Build Coastguard Worker 
165*f6dc9357SAndroid Build Coastguard Worker   return CheckBreak2();
166*f6dc9357SAndroid Build Coastguard Worker }
167*f6dc9357SAndroid Build Coastguard Worker 
168*f6dc9357SAndroid Build Coastguard Worker void SetExtractErrorMessage(Int32 opRes, Int32 encrypted, AString &s);
SetExtractErrorMessage(Int32 opRes,Int32 encrypted,AString & s)169*f6dc9357SAndroid Build Coastguard Worker void SetExtractErrorMessage(Int32 opRes, Int32 encrypted, AString &s)
170*f6dc9357SAndroid Build Coastguard Worker {
171*f6dc9357SAndroid Build Coastguard Worker   s.Empty();
172*f6dc9357SAndroid Build Coastguard Worker 
173*f6dc9357SAndroid Build Coastguard Worker   switch (opRes)
174*f6dc9357SAndroid Build Coastguard Worker   {
175*f6dc9357SAndroid Build Coastguard Worker     case NArchive::NExtract::NOperationResult::kOK:
176*f6dc9357SAndroid Build Coastguard Worker       return;
177*f6dc9357SAndroid Build Coastguard Worker     default:
178*f6dc9357SAndroid Build Coastguard Worker     {
179*f6dc9357SAndroid Build Coastguard Worker       UINT messageID = 0;
180*f6dc9357SAndroid Build Coastguard Worker       switch (opRes)
181*f6dc9357SAndroid Build Coastguard Worker       {
182*f6dc9357SAndroid Build Coastguard Worker         case NArchive::NExtract::NOperationResult::kUnsupportedMethod:
183*f6dc9357SAndroid Build Coastguard Worker           messageID = NMessageID::kExtractUnsupportedMethod;
184*f6dc9357SAndroid Build Coastguard Worker           break;
185*f6dc9357SAndroid Build Coastguard Worker         case NArchive::NExtract::NOperationResult::kCRCError:
186*f6dc9357SAndroid Build Coastguard Worker           messageID = encrypted ?
187*f6dc9357SAndroid Build Coastguard Worker             NMessageID::kExtractCRCFailedEncrypted :
188*f6dc9357SAndroid Build Coastguard Worker             NMessageID::kExtractCRCFailed;
189*f6dc9357SAndroid Build Coastguard Worker           break;
190*f6dc9357SAndroid Build Coastguard Worker         case NArchive::NExtract::NOperationResult::kDataError:
191*f6dc9357SAndroid Build Coastguard Worker           messageID = encrypted ?
192*f6dc9357SAndroid Build Coastguard Worker             NMessageID::kExtractDataErrorEncrypted :
193*f6dc9357SAndroid Build Coastguard Worker             NMessageID::kExtractDataError;
194*f6dc9357SAndroid Build Coastguard Worker           break;
195*f6dc9357SAndroid Build Coastguard Worker       }
196*f6dc9357SAndroid Build Coastguard Worker       if (messageID != 0)
197*f6dc9357SAndroid Build Coastguard Worker       {
198*f6dc9357SAndroid Build Coastguard Worker         s = g_StartupInfo.GetMsgString((int)messageID);
199*f6dc9357SAndroid Build Coastguard Worker         s.Replace((AString)" '%s'", AString());
200*f6dc9357SAndroid Build Coastguard Worker       }
201*f6dc9357SAndroid Build Coastguard Worker       else if (opRes == NArchive::NExtract::NOperationResult::kUnavailable)
202*f6dc9357SAndroid Build Coastguard Worker         s = "Unavailable data";
203*f6dc9357SAndroid Build Coastguard Worker       else if (opRes == NArchive::NExtract::NOperationResult::kUnexpectedEnd)
204*f6dc9357SAndroid Build Coastguard Worker         s = "Unexpected end of data";
205*f6dc9357SAndroid Build Coastguard Worker       else if (opRes == NArchive::NExtract::NOperationResult::kDataAfterEnd)
206*f6dc9357SAndroid Build Coastguard Worker         s = "There are some data after the end of the payload data";
207*f6dc9357SAndroid Build Coastguard Worker       else if (opRes == NArchive::NExtract::NOperationResult::kIsNotArc)
208*f6dc9357SAndroid Build Coastguard Worker         s = "Is not archive";
209*f6dc9357SAndroid Build Coastguard Worker       else if (opRes == NArchive::NExtract::NOperationResult::kHeadersError)
210*f6dc9357SAndroid Build Coastguard Worker         s = "kHeaders Error";
211*f6dc9357SAndroid Build Coastguard Worker       else if (opRes == NArchive::NExtract::NOperationResult::kWrongPassword)
212*f6dc9357SAndroid Build Coastguard Worker         s = "Wrong Password";
213*f6dc9357SAndroid Build Coastguard Worker       else
214*f6dc9357SAndroid Build Coastguard Worker       {
215*f6dc9357SAndroid Build Coastguard Worker         s = "Error #";
216*f6dc9357SAndroid Build Coastguard Worker         s.Add_UInt32((UInt32)opRes);
217*f6dc9357SAndroid Build Coastguard Worker       }
218*f6dc9357SAndroid Build Coastguard Worker     }
219*f6dc9357SAndroid Build Coastguard Worker   }
220*f6dc9357SAndroid Build Coastguard Worker }
221*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CExtractCallbackImp::SetOperationResult (Int32 opRes,Int32 encrypted))222*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CExtractCallbackImp::SetOperationResult(Int32 opRes, Int32 encrypted))
223*f6dc9357SAndroid Build Coastguard Worker {
224*f6dc9357SAndroid Build Coastguard Worker   MT_LOCK
225*f6dc9357SAndroid Build Coastguard Worker 
226*f6dc9357SAndroid Build Coastguard Worker   if (opRes == NArchive::NExtract::NOperationResult::kOK)
227*f6dc9357SAndroid Build Coastguard Worker   {
228*f6dc9357SAndroid Build Coastguard Worker     if (_percent)
229*f6dc9357SAndroid Build Coastguard Worker     {
230*f6dc9357SAndroid Build Coastguard Worker       _percent->Command.Empty();
231*f6dc9357SAndroid Build Coastguard Worker       _percent->FileName.Empty();
232*f6dc9357SAndroid Build Coastguard Worker       _percent->Files++;
233*f6dc9357SAndroid Build Coastguard Worker     }
234*f6dc9357SAndroid Build Coastguard Worker   }
235*f6dc9357SAndroid Build Coastguard Worker   else
236*f6dc9357SAndroid Build Coastguard Worker   {
237*f6dc9357SAndroid Build Coastguard Worker     AString s;
238*f6dc9357SAndroid Build Coastguard Worker     SetExtractErrorMessage(opRes, encrypted, s);
239*f6dc9357SAndroid Build Coastguard Worker     if (PrintErrorMessage(s, m_CurrentFilePath) == -1)
240*f6dc9357SAndroid Build Coastguard Worker       return E_ABORT;
241*f6dc9357SAndroid Build Coastguard Worker   }
242*f6dc9357SAndroid Build Coastguard Worker 
243*f6dc9357SAndroid Build Coastguard Worker   return CheckBreak2();
244*f6dc9357SAndroid Build Coastguard Worker }
245*f6dc9357SAndroid Build Coastguard Worker 
246*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CExtractCallbackImp::ReportExtractResult (Int32 opRes,Int32 encrypted,const wchar_t * name))247*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CExtractCallbackImp::ReportExtractResult(Int32 opRes, Int32 encrypted, const wchar_t *name))
248*f6dc9357SAndroid Build Coastguard Worker {
249*f6dc9357SAndroid Build Coastguard Worker   MT_LOCK
250*f6dc9357SAndroid Build Coastguard Worker 
251*f6dc9357SAndroid Build Coastguard Worker   if (opRes != NArchive::NExtract::NOperationResult::kOK)
252*f6dc9357SAndroid Build Coastguard Worker   {
253*f6dc9357SAndroid Build Coastguard Worker     AString s;
254*f6dc9357SAndroid Build Coastguard Worker     SetExtractErrorMessage(opRes, encrypted, s);
255*f6dc9357SAndroid Build Coastguard Worker     if (PrintErrorMessage(s, name) == -1)
256*f6dc9357SAndroid Build Coastguard Worker       return E_ABORT;
257*f6dc9357SAndroid Build Coastguard Worker   }
258*f6dc9357SAndroid Build Coastguard Worker 
259*f6dc9357SAndroid Build Coastguard Worker   return CheckBreak2();
260*f6dc9357SAndroid Build Coastguard Worker }
261*f6dc9357SAndroid Build Coastguard Worker 
262*f6dc9357SAndroid Build Coastguard Worker extern HRESULT GetPassword(UString &password);
263*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CExtractCallbackImp::CryptoGetTextPassword (BSTR * password))264*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CExtractCallbackImp::CryptoGetTextPassword(BSTR *password))
265*f6dc9357SAndroid Build Coastguard Worker {
266*f6dc9357SAndroid Build Coastguard Worker   MT_LOCK
267*f6dc9357SAndroid Build Coastguard Worker 
268*f6dc9357SAndroid Build Coastguard Worker   if (!m_PasswordIsDefined)
269*f6dc9357SAndroid Build Coastguard Worker   {
270*f6dc9357SAndroid Build Coastguard Worker     RINOK(GetPassword(m_Password))
271*f6dc9357SAndroid Build Coastguard Worker     m_PasswordIsDefined = true;
272*f6dc9357SAndroid Build Coastguard Worker   }
273*f6dc9357SAndroid Build Coastguard Worker   return StringToBstr(m_Password, password);
274*f6dc9357SAndroid Build Coastguard Worker }
275