| 286 | } |
| 287 | |
| 288 | UINT8 |
| 289 | CVfrBufferConfig::Write ( |
| 290 | IN CONST CHAR8 Mode, |
| 291 | IN CHAR8 *Name, |
| 292 | IN EFI_GUID *Guid, |
| 293 | IN CHAR8 *Id, |
| 294 | IN UINT8 Type, |
| 295 | IN UINT16 Offset, |
| 296 | IN UINT32 Width, |
| 297 | IN EFI_IFR_TYPE_VALUE Value |
| 298 | ) |
| 299 | { |
| 300 | UINT8 Ret; |
| 301 | SConfigItem *pItem; |
| 302 | SConfigInfo *pInfo; |
| 303 | |
| 304 | if ((Ret = Select (Name, Guid)) != 0) { |
| 305 | return Ret; |
| 306 | } |
| 307 | |
| 308 | switch (Mode) { |
| 309 | case 'a' : // add |
| 310 | if (Select (Name, Guid, Id) != 0) { |
| 311 | if ((pItem = new SConfigItem (Name, Guid, Id, Type, Offset, (UINT16) Width, Value)) == NULL) { |
| 312 | return 2; |
| 313 | } |
| 314 | if (mItemListHead == NULL) { |
| 315 | mItemListHead = pItem; |
| 316 | mItemListTail = pItem; |
| 317 | } else { |
| 318 | mItemListTail->mNext = pItem; |
| 319 | mItemListTail = pItem; |
| 320 | } |
| 321 | mItemListPos = pItem; |
| 322 | } else { |
| 323 | // tranverse the list to find out if there's already the value for the same offset |
| 324 | for (pInfo = mItemListPos->mInfoStrList; pInfo != NULL; pInfo = pInfo->mNext) { |
| 325 | if (pInfo->mOffset == Offset) { |
| 326 | return 0; |
| 327 | } |
| 328 | } |
| 329 | if((pInfo = new SConfigInfo (Type, Offset, Width, Value)) == NULL) { |
| 330 | return 2; |
| 331 | } |
| 332 | pInfo->mNext = mItemListPos->mInfoStrList; |
| 333 | mItemListPos->mInfoStrList = pInfo; |
| 334 | } |
| 335 | break; |
| 336 | |
| 337 | case 'd' : // delete |
| 338 | if (mItemListHead == mItemListPos) { |
| 339 | mItemListHead = mItemListPos->mNext; |
| 340 | delete mItemListPos; |
| 341 | break; |
| 342 | } |
| 343 | |
| 344 | for (pItem = mItemListHead; pItem->mNext != mItemListPos; pItem = pItem->mNext) |
| 345 | ; |
no test coverage detected