|
1 /* |
|
2 * Copyright (c) 2007 - 2008 Nokia Corporation and/or its subsidiary(-ies). |
|
3 * All rights reserved. |
|
4 * This component and the accompanying materials are made available |
|
5 * under the terms of "Eclipse Public License v1.0" |
|
6 * which accompanies this distribution, and is available |
|
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
8 * |
|
9 * Initial Contributors: |
|
10 * Nokia Corporation - initial contribution. |
|
11 * |
|
12 * Contributors: |
|
13 * |
|
14 * Description: Class, which handles storing and accessing certificate requests. |
|
15 * |
|
16 */ |
|
17 |
|
18 |
|
19 |
|
20 #include <bautils.h> |
|
21 |
|
22 #include "certificaterequeststore.h" |
|
23 |
|
24 |
|
25 _LIT(KCertReqPat, "*.req"); |
|
26 _LIT(KCertReqFileNameFormat, "certreq(%d).req"); |
|
27 |
|
28 |
|
29 CCertificateRequestStore* CCertificateRequestStore::NewL() |
|
30 { |
|
31 CCertificateRequestStore* self = new (ELeave) CCertificateRequestStore; |
|
32 CleanupStack::PushL(self); |
|
33 self->ConstructL(); |
|
34 CleanupStack::Pop(self); |
|
35 |
|
36 return self; |
|
37 } |
|
38 |
|
39 |
|
40 void CCertificateRequestStore::ConstructL() |
|
41 { |
|
42 User::LeaveIfError(iFileSession.Connect()); |
|
43 User::LeaveIfError(iFileSession.PrivatePath(iPrivatePath)); |
|
44 User::LeaveIfError(iFileSession.SetSessionPath(iPrivatePath)); |
|
45 } |
|
46 |
|
47 |
|
48 CCertificateRequestStore::~CCertificateRequestStore() |
|
49 { |
|
50 iFileSession.Close(); |
|
51 } |
|
52 |
|
53 |
|
54 TInt CCertificateRequestStore::CertReqCountL() |
|
55 { |
|
56 TInt count(0); |
|
57 |
|
58 TFindFile* fileFinder = new (ELeave) TFindFile(iFileSession); |
|
59 CleanupDeletePushL(fileFinder); |
|
60 |
|
61 CDir* fileList = NULL; |
|
62 TInt err = fileFinder->FindWildByDir(KCertReqPat, iPrivatePath, fileList); |
|
63 |
|
64 switch(err) |
|
65 { |
|
66 case KErrNone: |
|
67 count = fileList->Count(); |
|
68 delete fileList; |
|
69 fileList = NULL; |
|
70 break; |
|
71 case KErrNotFound: |
|
72 //No saved requests. |
|
73 //Returns zero. |
|
74 break; |
|
75 default: |
|
76 User::Leave(err); |
|
77 break; |
|
78 } |
|
79 |
|
80 CleanupStack::PopAndDestroy(fileFinder); |
|
81 return count; |
|
82 |
|
83 } |
|
84 |
|
85 |
|
86 |
|
87 CArrayFixFlat<TCertificateRequestListEntry>* CCertificateRequestStore::GetCertReqListLC() |
|
88 { |
|
89 CArrayFixFlat<TCertificateRequestListEntry>* list = |
|
90 new (ELeave) CArrayFixFlat<TCertificateRequestListEntry>(3); |
|
91 CleanupStack::PushL(list); |
|
92 |
|
93 TCertificateRequestListEntry certReqInfo; |
|
94 |
|
95 TFindFile* fileFinder = new (ELeave)TFindFile(iFileSession); |
|
96 CleanupDeletePushL(fileFinder); |
|
97 |
|
98 CDir* fileList; |
|
99 TInt err = fileFinder->FindWildByDir(KCertReqPat, iPrivatePath, fileList); |
|
100 |
|
101 switch(err) |
|
102 { |
|
103 case KErrNone: |
|
104 CleanupStack::PushL(fileList); |
|
105 for (TInt i = 0; i < fileList->Count(); i++) |
|
106 { |
|
107 certReqInfo.iObjectName = (*fileList)[i].iName; |
|
108 list->AppendL(certReqInfo); |
|
109 } |
|
110 CleanupStack::PopAndDestroy(); // fileList |
|
111 break; |
|
112 case KErrNotFound: |
|
113 //No saved requests. |
|
114 //Returns zero length array. |
|
115 break; |
|
116 default: |
|
117 User::Leave(err); |
|
118 break; |
|
119 } |
|
120 |
|
121 CleanupStack::PopAndDestroy(fileFinder); |
|
122 return list; |
|
123 } |
|
124 |
|
125 |
|
126 HBufC* CCertificateRequestStore::SaveCertRequestLC(const TDesC8& aCertReqData) |
|
127 { |
|
128 |
|
129 TFileName* certReqFileName = GetNewCertReqFileNameLC(); |
|
130 |
|
131 RFile certReqFile; |
|
132 User::LeaveIfError(certReqFile.Create(iFileSession, *certReqFileName, EFileWrite)); |
|
133 CleanupClosePushL(certReqFile); |
|
134 |
|
135 TInt err = certReqFile.Write(aCertReqData); |
|
136 |
|
137 CleanupStack::PopAndDestroy(); //certReqFile |
|
138 |
|
139 if (err != KErrNone) |
|
140 { |
|
141 //Just in case |
|
142 iFileSession.Delete(*certReqFileName); |
|
143 User::Leave(err); |
|
144 } |
|
145 |
|
146 |
|
147 HBufC* certReqObjectName = certReqFileName->AllocL(); |
|
148 CleanupStack::PopAndDestroy(certReqFileName); |
|
149 CleanupStack::PushL(certReqObjectName); |
|
150 |
|
151 return certReqObjectName; |
|
152 } |
|
153 |
|
154 |
|
155 HBufC8* CCertificateRequestStore::ReadCertRequestLC(const TDesC& aCertReqObjectName) |
|
156 { |
|
157 RFile file; |
|
158 User::LeaveIfError(file.Open(iFileSession, aCertReqObjectName, EFileRead)); |
|
159 CleanupClosePushL(file); |
|
160 |
|
161 TInt requestSize(0); |
|
162 User::LeaveIfError(file.Size(requestSize)); |
|
163 |
|
164 HBufC8* requestData = HBufC8::NewLC(requestSize); |
|
165 TPtr8 requestDataPtr(requestData->Des()); |
|
166 |
|
167 User::LeaveIfError(file.Read(requestDataPtr)); |
|
168 |
|
169 CleanupStack::Pop(requestData); |
|
170 CleanupStack::PopAndDestroy(); //file |
|
171 |
|
172 CleanupStack::PushL(requestData); |
|
173 |
|
174 return requestData; |
|
175 } |
|
176 |
|
177 |
|
178 void CCertificateRequestStore::DeleteCertRequestL(const TDesC& aCertReqObjectName) |
|
179 { |
|
180 User::LeaveIfError(iFileSession.Delete(aCertReqObjectName)); |
|
181 } |
|
182 |
|
183 |
|
184 TFileName* CCertificateRequestStore::GetNewCertReqFileNameLC() |
|
185 { |
|
186 TFileName* fileName = new (ELeave) TFileName; |
|
187 CleanupDeletePushL(fileName); |
|
188 |
|
189 TInt i = 0; |
|
190 do |
|
191 { |
|
192 fileName->Format(KCertReqFileNameFormat, i); |
|
193 if (!BaflUtils::FileExists(iFileSession, *fileName)) |
|
194 { |
|
195 break; |
|
196 } |
|
197 ++i; |
|
198 }while(i > 0); //loop infinite. |
|
199 |
|
200 return fileName; |
|
201 } |