41 // might leave. |
41 // might leave. |
42 // ------------------------------------------------------------------------------------------------ |
42 // ------------------------------------------------------------------------------------------------ |
43 // |
43 // |
44 CNSmlAgendaDataProvider::CNSmlAgendaDataProvider() |
44 CNSmlAgendaDataProvider::CNSmlAgendaDataProvider() |
45 { |
45 { |
46 FLOG(_L("CNSmlAgendaDataProvider::CNSmlAgendaDataProvider(): BEGIN")); |
46 _DBG_FILE("CNSmlAgendaDataProvider::CNSmlAgendaDataProvider(): BEGIN"); |
47 FLOG(_L("CNSmlAgendaDataProvider::CNSmlAgendaDataProvider(): END")); |
47 _DBG_FILE("CNSmlAgendaDataProvider::CNSmlAgendaDataProvider(): END"); |
48 } |
48 } |
49 |
49 |
50 // ------------------------------------------------------------------------------------------------ |
50 // ------------------------------------------------------------------------------------------------ |
51 // CNSmlAgendaDataProvider::ConstructL |
51 // CNSmlAgendaDataProvider::ConstructL |
52 // Symbian 2nd phase constructor can leave. |
52 // Symbian 2nd phase constructor can leave. |
53 // ------------------------------------------------------------------------------------------------ |
53 // ------------------------------------------------------------------------------------------------ |
54 // |
54 // |
55 void CNSmlAgendaDataProvider::ConstructL( ) |
55 void CNSmlAgendaDataProvider::ConstructL( ) |
56 { |
56 { |
57 FLOG(_L("CNSmlAgendaDataProvider::NewL: BEGIN")); |
57 _DBG_FILE("CNSmlAgendaDataProvider::NewL: BEGIN"); |
58 iAgnDataStore = CNSmlAgendaDataStore::NewL(); |
58 iAgnDataStore = CNSmlAgendaDataStore::NewL(); |
59 FLOG(_L("CNSmlAgendaDataProvider::NewL: END")); |
59 iStringPool.OpenL(); |
|
60 User::LeaveIfError( iSession.Connect() ); |
|
61 _DBG_FILE("CNSmlAgendaDataProvider::NewL: BEGIN"); |
60 } |
62 } |
61 |
63 |
62 // ------------------------------------------------------------------------------------------------ |
64 // ------------------------------------------------------------------------------------------------ |
63 // CNSmlAgendaDataProvider::NewL |
65 // CNSmlAgendaDataProvider::NewL |
64 // Two-phased constructor. |
66 // Two-phased constructor. |
65 // ------------------------------------------------------------------------------------------------ |
67 // ------------------------------------------------------------------------------------------------ |
66 // |
68 // |
67 CNSmlAgendaDataProvider* CNSmlAgendaDataProvider::NewL() |
69 CNSmlAgendaDataProvider* CNSmlAgendaDataProvider::NewL() |
68 { |
70 { |
69 FLOG(_L("CNSmlAgendaDataProvider::NewL: BEGIN")); |
71 _DBG_FILE("CNSmlAgendaDataProvider::NewL: BEGIN"); |
70 CNSmlAgendaDataProvider* self = new ( ELeave ) CNSmlAgendaDataProvider(); |
72 CNSmlAgendaDataProvider* self = new ( ELeave ) CNSmlAgendaDataProvider(); |
71 CleanupStack::PushL( self ); |
73 CleanupStack::PushL( self ); |
72 self->ConstructL(); |
74 self->ConstructL(); |
73 CleanupStack::Pop( self ); |
75 CleanupStack::Pop( self ); |
74 FLOG(_L("CNSmlAgendaDataProvider::NewL: END")); |
76 _DBG_FILE("CNSmlAgendaDataProvider::NewL: BEGIN"); |
75 return self; |
77 return self; |
76 } |
78 } |
77 |
79 |
78 // ------------------------------------------------------------------------------------------------ |
80 // ------------------------------------------------------------------------------------------------ |
79 // CNSmlAgendaDataProvider::~CNSmlAgendaDataProvider |
81 // CNSmlAgendaDataProvider::~CNSmlAgendaDataProvider |
80 // Destructor. |
82 // Destructor. |
81 // ------------------------------------------------------------------------------------------------ |
83 // ------------------------------------------------------------------------------------------------ |
82 // |
84 // |
83 CNSmlAgendaDataProvider::~CNSmlAgendaDataProvider() |
85 CNSmlAgendaDataProvider::~CNSmlAgendaDataProvider() |
84 { |
86 { |
85 FLOG(_L("CNSmlAgendaDataProvider::~CNSmlAgendaDataProvider(): BEGIN")); |
87 _DBG_FILE("CNSmlAgendaDataProvider::~CNSmlAgendaDataProvider(): BEGIN"); |
|
88 delete iAgnDataStore; |
|
89 iSession.Close(); |
86 delete iDSFormat; |
90 delete iDSFormat; |
87 delete iAgnDataStore; |
91 iStringPool.Close(); |
88 iFilterArray.ResetAndDestroy(); |
92 iFilterArray.ResetAndDestroy(); |
89 iFilterArray.Close(); |
93 iFilterArray.Close(); |
90 FLOG(_L("CNSmlAgendaDataProvider::~CNSmlAgendaDataProvider(): END")); |
94 _DBG_FILE("CNSmlAgendaDataProvider::~CNSmlAgendaDataProvider(): END"); |
91 } |
95 } |
92 |
96 |
93 // ------------------------------------------------------------------------------------------------ |
97 // ------------------------------------------------------------------------------------------------ |
94 // CNSmlAgendaDataProvider::DoOnFrameworkEvent |
98 // CNSmlAgendaDataProvider::DoOnFrameworkEvent |
95 // Not supported. |
99 // Not supported. |
96 // ------------------------------------------------------------------------------------------------ |
100 // ------------------------------------------------------------------------------------------------ |
97 // |
101 // |
98 void CNSmlAgendaDataProvider::DoOnFrameworkEvent( TSmlFrameworkEvent /*aEvent*/, TInt /*aParam1*/, TInt /*aParam2*/ ) |
102 void CNSmlAgendaDataProvider::DoOnFrameworkEvent( TSmlFrameworkEvent /*aEvent*/, TInt /*aParam1*/, TInt /*aParam2*/ ) |
99 { |
103 { |
100 FLOG(_L("CNSmlAgendaDataProvider::DoOnFrameworkEvent: BEGIN")); |
104 _DBG_FILE("CNSmlAgendaDataProvider::DoOnFrameworkEvent: BEGIN"); |
101 FLOG(_L("CNSmlAgendaDataProvider::DoOnFrameworkEvent: END")); |
105 _DBG_FILE("CNSmlAgendaDataProvider::DoOnFrameworkEvent: END"); |
102 } |
106 } |
103 |
107 |
104 // ------------------------------------------------------------------------------------------------ |
108 // ------------------------------------------------------------------------------------------------ |
105 // CNSmlAgendaDataProvider::DoSupportsOperation |
109 // CNSmlAgendaDataProvider::DoSupportsOperation |
106 // Return supported operation uid. |
110 // Return supported operation uid. |
107 // ------------------------------------------------------------------------------------------------ |
111 // ------------------------------------------------------------------------------------------------ |
108 // |
112 // |
109 TBool CNSmlAgendaDataProvider::DoSupportsOperation( TUid aOpId ) const |
113 TBool CNSmlAgendaDataProvider::DoSupportsOperation( TUid aOpId ) const |
110 { |
114 { |
111 FLOG(_L("CNSmlAgendaDataProvider::DoSupportsOperation: BEGIN")); |
115 _DBG_FILE("CNSmlAgendaDataProvider::DoSupportsOperation: BEGIN"); |
112 if ( aOpId == KUidSmlSupportMultipleStores ) |
116 if ( aOpId == KUidSmlSupportMultipleStores ) |
113 { |
117 { |
114 FLOG(_L("CNSmlAgendaDataProvider::DoSupportsOperation: END")); |
118 _DBG_FILE("CNSmlAgendaDataProvider::DoSupportsOperation: END"); |
115 return ETrue; |
119 return ETrue; |
116 } |
120 } |
117 FLOG(_L("CNSmlAgendaDataProvider::DoSupportsOperation: END")); |
121 _DBG_FILE("CNSmlAgendaDataProvider::DoSupportsOperation: END"); |
118 return EFalse; |
122 return EFalse; |
119 } |
123 } |
120 |
124 |
121 // ------------------------------------------------------------------------------------------------ |
125 // ------------------------------------------------------------------------------------------------ |
122 // CNSmlAgendaDataProvider::DoStoreFormatL |
126 // CNSmlAgendaDataProvider::DoStoreFormatL |
123 // Return the current data store format. |
127 // Return the current data store format. |
124 // ------------------------------------------------------------------------------------------------ |
128 // ------------------------------------------------------------------------------------------------ |
125 // |
129 // |
126 const CSmlDataStoreFormat& CNSmlAgendaDataProvider::DoStoreFormatL() |
130 const CSmlDataStoreFormat& CNSmlAgendaDataProvider::DoStoreFormatL() |
127 { |
131 { |
128 FLOG(_L("CNSmlAgendaDataProvider::DoStoreFormatL(): BEGIN")); |
132 _DBG_FILE("CNSmlAgendaDataProvider::DoStoreFormatL(): BEGIN"); |
129 |
133 |
130 if ( iDSFormat ) |
134 if ( iDSFormat ) |
131 { |
135 { |
132 delete iDSFormat; |
136 delete iDSFormat; |
133 iDSFormat = NULL; |
137 iDSFormat = NULL; |
134 } |
138 } |
135 // RD_MULTICAL |
139 iDSFormat = DoOwnStoreFormatL(); |
136 iDSFormat = iAgnDataStore->StoreFormatL(); |
140 |
137 // RD_MULTICAL |
141 return *iDSFormat; |
138 return *iDSFormat; |
|
139 } |
142 } |
140 |
143 |
141 // ------------------------------------------------------------------------------------------------ |
144 // ------------------------------------------------------------------------------------------------ |
142 // CNSmlAgendaDataProvider::DoListStoresLC |
145 // CNSmlAgendaDataProvider::DoListStoresLC |
143 // Return the list of datastore names. |
146 // Return the list of datastore names. |
144 // ------------------------------------------------------------------------------------------------ |
147 // ------------------------------------------------------------------------------------------------ |
145 // |
148 // |
146 CDesCArray* CNSmlAgendaDataProvider::DoListStoresLC() |
149 CDesCArray* CNSmlAgendaDataProvider::DoListStoresLC() |
147 { |
150 { |
148 FLOG(_L("CNSmlAgendaDataProvider::DoListStoresLC(): BEGIN")); |
151 _DBG_FILE("CNSmlAgendaDataProvider::DoListStoresLC(): BEGIN"); |
149 FLOG(_L("CNSmlAgendaDataProvider::DoListStoresLC(): END")); |
152 _DBG_FILE("CNSmlAgendaDataProvider::DoListStoresLC(): END"); |
150 return iAgnDataStore->DoListAgendaFilesLC(); |
153 return iAgnDataStore->DoListAgendaFilesLC(); |
151 } |
154 } |
152 |
155 |
153 // ------------------------------------------------------------------------------------------------ |
156 // ------------------------------------------------------------------------------------------------ |
154 // CNSmlAgendaDataProvider::DoDefaultStoreL |
157 // CNSmlAgendaDataProvider::DoDefaultStoreL |
155 // Return the name of default store name. |
158 // Return the name of default store name. |
156 // ------------------------------------------------------------------------------------------------ |
159 // ------------------------------------------------------------------------------------------------ |
157 // |
160 // |
158 const TDesC& CNSmlAgendaDataProvider::DoDefaultStoreL() |
161 const TDesC& CNSmlAgendaDataProvider::DoDefaultStoreL() |
159 { |
162 { |
160 FLOG(_L("CNSmlAgendaDataProvider::DoDefaultStoreL(): BEGIN")); |
163 _DBG_FILE("CNSmlAgendaDataProvider::DoDefaultStoreL(): BEGIN"); |
161 FLOG(_L("CNSmlAgendaDataProvider::DoDefaultStoreL(): END")); |
164 _DBG_FILE("CNSmlAgendaDataProvider::DoDefaultStoreL(): END"); |
162 return iAgnDataStore->DoGetDefaultFileNameL(); |
165 return iAgnDataStore->DoGetDefaultFileNameL(); |
163 } |
166 } |
164 |
167 |
165 // ------------------------------------------------------------------------------------------------ |
168 // ------------------------------------------------------------------------------------------------ |
166 // CNSmlAgendaDataProvider::DoNewStoreInstanceLC |
169 // CNSmlAgendaDataProvider::DoNewStoreInstanceLC |
167 // Return instance of data store |
170 // Return instance of data store |
168 // ------------------------------------------------------------------------------------------------ |
171 // ------------------------------------------------------------------------------------------------ |
169 // |
172 // |
170 CSmlDataStore* CNSmlAgendaDataProvider::DoNewStoreInstanceLC() |
173 CSmlDataStore* CNSmlAgendaDataProvider::DoNewStoreInstanceLC() |
171 { |
174 { |
172 FLOG(_L("CNSmlAgendaDataProvider::DoNewStoreInstanceLC(): BEGIN")); |
175 _DBG_FILE("CNSmlAgendaDataProvider::DoNewStoreInstanceLC(): BEGIN"); |
173 CNSmlAgendaDataStore* newStore = CNSmlAgendaDataStore::NewL(); |
176 CNSmlAgendaDataStore* newStore = CNSmlAgendaDataStore::NewL(); |
174 CleanupStack::PushL( newStore ); |
177 CleanupStack::PushL( newStore ); |
175 FLOG(_L("CNSmlAgendaDataProvider::DoNewStoreInstanceLC(): END")); |
178 _DBG_FILE("CNSmlAgendaDataProvider::DoNewStoreInstanceLC(): END"); |
176 return newStore; |
179 return newStore; |
177 } |
180 } |
178 |
181 |
179 // ------------------------------------------------------------------------------------------------ |
182 // ------------------------------------------------------------------------------------------------ |
180 // CNSmlAgendaDataProvider::DoSupportedServerFiltersL |
183 // CNSmlAgendaDataProvider::DoSupportedServerFiltersL |
181 // |
184 // |
182 // ------------------------------------------------------------------------------------------------ |
185 // ------------------------------------------------------------------------------------------------ |
183 const RPointerArray<CSyncMLFilter>& CNSmlAgendaDataProvider::DoSupportedServerFiltersL() |
186 const RPointerArray<CSyncMLFilter>& CNSmlAgendaDataProvider::DoSupportedServerFiltersL() |
184 { |
187 { |
185 // This method returns empty array. It means that this Data Provider does not support filtering |
188 // This method returns empty array. It means that this Data Provider does not support filtering |
186 FLOG(_L("CNSmlAgendaDataProvider::DoSupportedServerFiltersL(): BEGIN")); |
189 _DBG_FILE("CNSmlAgendaDataProvider::DoSupportedServerFiltersL(): BEGIN"); |
187 FLOG(_L("CNSmlAgendaDataProvider::DoSupportedServerFiltersL(): END")); |
190 _DBG_FILE("CNSmlAgendaDataProvider::DoSupportedServerFiltersL(): END"); |
188 return iFilterArray; |
191 return iFilterArray; |
189 } |
192 } |
190 |
193 |
191 // ------------------------------------------------------------------------------------------------ |
194 // ------------------------------------------------------------------------------------------------ |
192 // CNSmlAgendaDataProvider::DoCheckSupportedServerFiltersL |
195 // CNSmlAgendaDataProvider::DoCheckSupportedServerFiltersL |
193 // |
196 // |
194 // ------------------------------------------------------------------------------------------------ |
197 // ------------------------------------------------------------------------------------------------ |
195 void CNSmlAgendaDataProvider::DoCheckSupportedServerFiltersL( const CSmlDataStoreFormat& /*aServerDataStoreFormat*/, RPointerArray<CSyncMLFilter>& /*aFilters*/, TSyncMLFilterChangeInfo& /*aChangeInfo*/ ) |
198 void CNSmlAgendaDataProvider::DoCheckSupportedServerFiltersL( const CSmlDataStoreFormat& /*aServerDataStoreFormat*/, RPointerArray<CSyncMLFilter>& /*aFilters*/, TSyncMLFilterChangeInfo& /*aChangeInfo*/ ) |
196 { |
199 { |
197 FLOG(_L("CNSmlAgendaDataProvider::DoCheckSupportedServerFiltersL(): BEGIN")); |
200 _DBG_FILE("CNSmlAgendaDataProvider::DoCheckSupportedServerFiltersL(): BEGIN"); |
198 FLOG(_L("CNSmlAgendaDataProvider::DoCheckSupportedServerFiltersL(): END")); |
|
199 User::Leave( KErrNotSupported ); |
201 User::Leave( KErrNotSupported ); |
|
202 _DBG_FILE("CNSmlAgendaDataProvider::DoCheckSupportedServerFiltersL(): END"); |
200 } |
203 } |
201 |
204 |
202 // ------------------------------------------------------------------------------------------------ |
205 // ------------------------------------------------------------------------------------------------ |
203 // CNSmlAgendaDataProvider::CheckServerFiltersL |
206 // CNSmlAgendaDataProvider::CheckServerFiltersL |
204 // |
207 // |
205 // ------------------------------------------------------------------------------------------------ |
208 // ------------------------------------------------------------------------------------------------ |
206 void CNSmlAgendaDataProvider::DoCheckServerFiltersL( RPointerArray<CSyncMLFilter>& /*aFilters*/, TSyncMLFilterChangeInfo& /*aChangeInfo*/ ) |
209 void CNSmlAgendaDataProvider::DoCheckServerFiltersL( RPointerArray<CSyncMLFilter>& /*aFilters*/, TSyncMLFilterChangeInfo& /*aChangeInfo*/ ) |
207 { |
210 { |
208 FLOG(_L("CNSmlAgendaDataProvider::DoCheckServerFiltersL(): BEGIN")); |
211 _DBG_FILE("CNSmlAgendaDataProvider::DoCheckServerFiltersL(): BEGIN"); |
209 FLOG(_L("CNSmlAgendaDataProvider::DoCheckServerFiltersL(): END")); |
|
210 User::Leave( KErrNotSupported ); |
212 User::Leave( KErrNotSupported ); |
|
213 _DBG_FILE("CNSmlAgendaDataProvider::DoCheckServerFiltersL(): END"); |
211 } |
214 } |
212 |
215 |
213 // ------------------------------------------------------------------------------------------------ |
216 // ------------------------------------------------------------------------------------------------ |
214 // CNSmlAgendaDataProvider::DoGenerateRecordFilterQueryLC |
217 // CNSmlAgendaDataProvider::DoGenerateRecordFilterQueryLC |
215 // |
218 // |
216 // ------------------------------------------------------------------------------------------------ |
219 // ------------------------------------------------------------------------------------------------ |
217 HBufC* CNSmlAgendaDataProvider::DoGenerateRecordFilterQueryLC( const RPointerArray<CSyncMLFilter>& /*aFilters*/, TSyncMLFilterMatchType /*aMatch*/, TDes& /*aFilterMimeType*/, TSyncMLFilterType& /*aFilterType*/, TDesC& /*aStoreName*/ ) |
220 HBufC* CNSmlAgendaDataProvider::DoGenerateRecordFilterQueryLC( const RPointerArray<CSyncMLFilter>& /*aFilters*/, TSyncMLFilterMatchType /*aMatch*/, TDes& /*aFilterMimeType*/, TSyncMLFilterType& /*aFilterType*/, TDesC& /*aStoreName*/ ) |
218 { |
221 { |
219 FLOG(_L("CNSmlAgendaDataProvider::DoGenerateRecordFilterQueryLC(): BEGIN")); |
222 _DBG_FILE("CNSmlAgendaDataProvider::DoGenerateRecordFilterQueryLC(): BEGIN"); |
220 FLOG(_L("CNSmlAgendaDataProvider::DoGenerateRecordFilterQueryLC(): END")); |
|
221 User::Leave( KErrNotSupported ); |
223 User::Leave( KErrNotSupported ); |
|
224 _DBG_FILE("CNSmlAgendaDataProvider::DoGenerateRecordFilterQueryLC(): END"); |
222 return NULL; |
225 return NULL; |
223 } |
226 } |
224 |
227 |
225 // ------------------------------------------------------------------------------------------------ |
228 // ------------------------------------------------------------------------------------------------ |
226 // CNSmlAgendaDataProvider::DoGenerateFieldFilterQueryL |
229 // CNSmlAgendaDataProvider::DoGenerateFieldFilterQueryL |
227 // |
230 // |
228 // ------------------------------------------------------------------------------------------------ |
231 // ------------------------------------------------------------------------------------------------ |
229 void CNSmlAgendaDataProvider::DoGenerateFieldFilterQueryL( const RPointerArray<CSyncMLFilter>& /*aFilters*/, TDes& /*aFilterMimeType*/, RPointerArray<CSmlDataProperty>& /*aProperties*/, TDesC& /*aStoreName*/ ) |
232 void CNSmlAgendaDataProvider::DoGenerateFieldFilterQueryL( const RPointerArray<CSyncMLFilter>& /*aFilters*/, TDes& /*aFilterMimeType*/, RPointerArray<CSmlDataProperty>& /*aProperties*/, TDesC& /*aStoreName*/ ) |
230 { |
233 { |
231 FLOG(_L("CNSmlAgendaDataProvider::DoGenerateFieldFilterQueryL(): BEGIN")); |
234 _DBG_FILE("CNSmlAgendaDataProvider::DoGenerateFieldFilterQueryL(): BEGIN"); |
232 FLOG(_L("CNSmlAgendaDataProvider::DoGenerateFieldFilterQueryL(): END")); |
|
233 User::Leave( KErrNotSupported ); |
235 User::Leave( KErrNotSupported ); |
|
236 _DBG_FILE("CNSmlAgendaDataProvider::DoGenerateFieldFilterQueryL(): END"); |
|
237 } |
|
238 |
|
239 // ------------------------------------------------------------------------------------------------ |
|
240 // CNSmlAgendaDataProvider::DoOwnStoreFormatL |
|
241 // Read own store format from own resource file. |
|
242 // ------------------------------------------------------------------------------------------------ |
|
243 // |
|
244 CSmlDataStoreFormat* CNSmlAgendaDataProvider::DoOwnStoreFormatL() |
|
245 { |
|
246 _DBG_FILE("CNSmlAgendaDataProvider::DoOwnStoreFormatL(): BEGIN"); |
|
247 TFileName fileName; |
|
248 TParse parse; |
|
249 |
|
250 // Check correct Data Sync protocol |
|
251 TInt value( EDataSyncNotRunning ); |
|
252 TInt error = RProperty::Get( KPSUidDataSynchronizationInternalKeys, |
|
253 KDataSyncStatus, |
|
254 value ); |
|
255 if ( error == KErrNone && |
|
256 value == EDataSyncRunning ) |
|
257 { |
|
258 parse.Set( KNSmlDSAgendaDataStoreRsc_1_1_2, &KDC_RESOURCE_FILES_DIR, NULL ); |
|
259 } |
|
260 else // error or protocol version 1.2 |
|
261 { |
|
262 parse.Set( KNSmlDSAgendaDataStoreRsc_1_2, &KDC_RESOURCE_FILES_DIR, NULL ); |
|
263 } |
|
264 |
|
265 fileName = parse.FullName(); |
|
266 RResourceFile resourceFile; |
|
267 BaflUtils::NearestLanguageFile( iSession, fileName ); |
|
268 |
|
269 resourceFile.OpenL( iSession, fileName ); |
|
270 CleanupClosePushL( resourceFile ); |
|
271 |
|
272 HBufC8* profileRes = resourceFile.AllocReadLC( NSML_AGENDA_DATA_STORE ); |
|
273 TResourceReader reader; |
|
274 reader.SetBuffer( profileRes ); |
|
275 |
|
276 CSmlDataStoreFormat* dsFormat = CSmlDataStoreFormat::NewLC( iStringPool, reader ); |
|
277 CleanupStack::Pop(); // dsFormat |
|
278 CleanupStack::PopAndDestroy( 2 ); // profileRes, resourceFile |
|
279 _DBG_FILE("CNSmlAgendaDataProvider::DoOwnStoreFormatL(): END"); |
|
280 return dsFormat; |
234 } |
281 } |
235 |
282 |
236 // =================================== OTHER EXPORTED FUNCTIONS =================================== |
283 // =================================== OTHER EXPORTED FUNCTIONS =================================== |
237 #ifndef IMPLEMENTATION_PROXY_ENTRY |
284 #ifndef IMPLEMENTATION_PROXY_ENTRY |
238 #define IMPLEMENTATION_PROXY_ENTRY( aUid, aFuncPtr ) { { aUid }, ( aFuncPtr ) } |
285 #define IMPLEMENTATION_PROXY_ENTRY( aUid, aFuncPtr ) { { aUid }, ( aFuncPtr ) } |