pkiutilities/PKCS12/CrBer/Src/Crberset.cpp
changeset 0 164170e6151a
child 5 3b17fc5c9564
equal deleted inserted replaced
-1:000000000000 0:164170e6151a
       
     1 /*
       
     2 * Copyright (c) 2000, 2004 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:   This module contains the implementation of CCrBerSet class. 
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 //  INCLUDE FILES
       
    21 
       
    22 #include "crber.h"
       
    23 
       
    24 
       
    25 // -----------------------------------------------------------------------------
       
    26 //CCrBerSet
       
    27 //Constructor
       
    28 // -----------------------------------------------------------------------------
       
    29 CCrBerSet::CCrBerSet(TInt aGranularity)
       
    30     : CArrayPtrSeg<CCrBer>(aGranularity), iLevel(0)
       
    31     {
       
    32     }
       
    33 
       
    34 // -----------------------------------------------------------------------------
       
    35 // CCrBerSet
       
    36 // Destructor
       
    37 // This function destructs CCrBerSet object
       
    38 // -----------------------------------------------------------------------------
       
    39 CCrBerSet::~CCrBerSet()
       
    40     {
       
    41     ResetAndDestroy();
       
    42     }
       
    43 
       
    44 // -----------------------------------------------------------------------------
       
    45 // CCrBerSet::ConstructL
       
    46 // This function initializes CCrBerSet object's member objects.
       
    47 // -----------------------------------------------------------------------------
       
    48 TAny CCrBerSet::ConstructL()
       
    49     {
       
    50     }
       
    51 
       
    52 // -----------------------------------------------------------------------------
       
    53 // CCrBerSet::NewLC
       
    54 // -----------------------------------------------------------------------------
       
    55 EXPORT_C CCrBerSet* CCrBerSet::NewLC(TInt aGranularity)
       
    56     {
       
    57     CCrBerSet* self = new (ELeave) CCrBerSet(aGranularity);
       
    58     CleanupStack::PushL(self);
       
    59 
       
    60     self->ConstructL();
       
    61 
       
    62     return self; 
       
    63     }
       
    64 
       
    65 // -----------------------------------------------------------------------------
       
    66 // CCrBerSet::NewL
       
    67 // -----------------------------------------------------------------------------
       
    68 EXPORT_C CCrBerSet* CCrBerSet::NewL(TInt aGranularity)
       
    69     {
       
    70     CCrBerSet* self = NewLC(aGranularity);
       
    71     CleanupStack::Pop();
       
    72 
       
    73     return self; 
       
    74     }
       
    75 
       
    76 // -----------------------------------------------------------------------------
       
    77 // CCrBerSet::OpenL
       
    78 // 
       
    79 // Opens next BER encoded object from the current position of
       
    80 // given CCrData to this object set. Opens also all nested BER
       
    81 // objects as deep as aRecursionLevel tells. If it is zero, one
       
    82 // object is read, if it is one, all objects at first level are
       
    83 // read, and if it is 0xff, all objects at 255 first levels are
       
    84 // extracted. This function cannot be used to extract deeper
       
    85 // structures than that, if you want to go deeper, implement
       
    86 // a function of your own. Returns the amount of extracted
       
    87 // objects. The data pointer of CCrData points right after the
       
    88 // opened BER object after this function is finished.
       
    89 // Parameters: CCrData* aData    Data object containing the BER
       
    90 //                               object to be opened.
       
    91 // Returns:    TUint             Amount of BER objects extracted.
       
    92 // -----------------------------------------------------------------------------
       
    93 EXPORT_C TUint CCrBerSet::OpenL(
       
    94     CCrData* aData,
       
    95     TUint8   aRecursionLevel /* = 1 */)
       
    96     {
       
    97     TInt    i       = 0;
       
    98     TUint   level   = 0;
       
    99     TUint8  amount  = 0;
       
   100     TInt definiteObjectEnd [255]= {0};
       
   101     TBerTag  type    = KBerEndOfContent;
       
   102     CCrBer* newObject = 0;
       
   103 
       
   104     while (type != KBerUnknown)
       
   105         {
       
   106         // Don't create new object if old is to be recycled.
       
   107         if (newObject == 0)
       
   108             {
       
   109             newObject = CCrBer::NewLC(level);
       
   110             }
       
   111 
       
   112         // Read next BER object.
       
   113         if ((type = newObject->Read(aData)) != KBerUnknown)
       
   114             {                   
       
   115             i = 0;
       
   116             // check definite seq(e.g) end, and if so, take away 1 level. 
       
   117             while (definiteObjectEnd[i] != 0)
       
   118                 {
       
   119                 if ((definiteObjectEnd[i]  <= newObject->ObjectLen() 
       
   120                     + newObject->ObjectBegin()) &&
       
   121                     (definiteObjectEnd[i]) &&
       
   122                    !(newObject->IsSeqOrSet(type)))                                    
       
   123                     {                
       
   124                     level--;                
       
   125                     definiteObjectEnd[i] = 0;
       
   126                     }
       
   127                 i++;
       
   128                 }
       
   129             // If type is explicit or implicit constructed or sequence
       
   130             // or set with indefinite length, we are one level deeper.
       
   131             if (CCrBer::IsSeqOrSet(type))
       
   132                  {
       
   133                 if (newObject->Indefinite())
       
   134                     {
       
   135                     level++;
       
   136                     }
       
   137                 else 
       
   138                     {               
       
   139                     level++;
       
   140                     i = 0;
       
   141                     while (definiteObjectEnd[i] != 0)
       
   142                         {
       
   143                         i++;
       
   144                         }
       
   145                     definiteObjectEnd[i] = newObject->ObjectLen() 
       
   146                         + newObject->ObjectBegin();                                      
       
   147                     }
       
   148 				// Changed by junuutin on 3.5.2004:				
       
   149 				if ((type == KBerImplicit) || (type == KBerExplicit))
       
   150 					{
       
   151 						// Don't try to parse the content of context-specified stuff
       
   152 			            // Jump to next object.
       
   153 						TInt currentPos = 0;
       
   154 						aData->Seek(ESeekCurrent, currentPos);
       
   155                         TInt pos = currentPos + newObject->ContentLen(); 
       
   156                         aData->Seek(ESeekStart, pos);
       
   157                         level--;
       
   158 					} 
       
   159 				else if ((type == KBerImplicitConstructed) || (type == KBerExplicitConstructed))
       
   160                     {
       
   161                      TInt currentPos = 0;
       
   162                      aData->Seek(ESeekCurrent, currentPos);
       
   163                      CCrBer* tempObject = CCrBer::NewL();
       
   164                      
       
   165                      // Read next BER object.
       
   166                      TBerTag tempType = tempObject->Read(aData);
       
   167                      if (!(CCrBer::IsKnownType(tempType)))
       
   168                         {
       
   169                         // Jump to next object.
       
   170                         TInt pos = currentPos + newObject->ContentLen(); 
       
   171                         aData->Seek(ESeekStart, pos);
       
   172                         level--;
       
   173 
       
   174                         }
       
   175                      else // return current position.
       
   176                          {
       
   177                          aData->Seek(ESeekStart, currentPos);
       
   178                          }
       
   179 
       
   180                     delete tempObject;
       
   181                     tempObject = NULL;
       
   182                     } 
       
   183                 } 
       
   184 
       
   185             // If type is end-of-content tag, last constructed object,
       
   186             // sequence or set with indefinite length has ended, we
       
   187             // are one level lower.
       
   188             if (type == KBerEndOfContent)
       
   189                 {
       
   190                 level--;
       
   191 
       
   192                 // Also set new object's level to current,
       
   193                 // because that's where it actually belongs.
       
   194                 newObject->SetLevel(level);
       
   195             
       
   196             
       
   197                 // Close last sequence or set.
       
   198                 CloseLastSeqOrSet(level);
       
   199                 }
       
   200 
       
   201             // If it is of known type, append object to this set,
       
   202             // null the pointer and continue to look for next objects.
       
   203             // Append only if wanted recursion level not exceeded.
       
   204             if ((level <= aRecursionLevel) || (aRecursionLevel == 255))
       
   205                 {
       
   206                 AppendAndUpdateL(newObject);
       
   207                 CleanupStack::Pop(); //newObject
       
   208                 newObject = NULL;
       
   209                 }
       
   210             else
       
   211                 {
       
   212                 // Anyway previous open objects have to be
       
   213                 // updated with the length of this object.
       
   214                 Update(newObject);
       
   215                 }
       
   216 
       
   217             // Anyway we have one item more.
       
   218             
       
   219             amount++;
       
   220             }
       
   221         else
       
   222             {
       
   223             // Otherwise delete object and stop the whole thing.
       
   224             // Don't return those bloody errors, because we cannot
       
   225             // know what the caller was looking for, let him evaluate
       
   226             // the results and decide whether this was a failure or not.
       
   227             //delete newObject;
       
   228             CleanupStack::PopAndDestroy();
       
   229 
       
   230             // go to return 
       
   231             type = KBerUnknown;         
       
   232             }
       
   233         }
       
   234 
       
   235     return amount;
       
   236     }
       
   237 
       
   238 // -----------------------------------------------------------------------------
       
   239 // CCrBerSet::AppendAndUpdateL
       
   240 // Appends given new object into this set. Updates all previous
       
   241 // items in this set, which have indefinite length, with the
       
   242 // length of the new object.
       
   243 // Parameters: CCrBer* aBerObject    New BER object to be added to this set
       
   244 // -----------------------------------------------------------------------------
       
   245 EXPORT_C TAny CCrBerSet::AppendAndUpdateL(CCrBer* aBerObject)
       
   246     {
       
   247     Update(aBerObject);
       
   248 
       
   249     AppendL(aBerObject);
       
   250     }
       
   251 
       
   252 // -----------------------------------------------------------------------------
       
   253 // CCrBerSet::Update
       
   254 // Updates all previous items in this set, which have
       
   255 // indefinite length, with the length of the new object.
       
   256 // Parameters: CCrBer* aBerObject    New BER object with whom
       
   257 //                                   this set is updated.
       
   258 // -----------------------------------------------------------------------------
       
   259 EXPORT_C TAny CCrBerSet::Update(CCrBer* aBerObject)
       
   260     {
       
   261     TInt  add = 0;
       
   262     TInt  index = 0;
       
   263     TInt  size = 0;
       
   264     TUint berObjectLevel = 0; 
       
   265 
       
   266     CCrBer* obj;
       
   267 
       
   268     if (aBerObject == 0)
       
   269         {
       
   270         return;
       
   271         }
       
   272 
       
   273     // Loop backwards through set and append length of the new object
       
   274     // to the lengths of each found upper constructed, sequence or set
       
   275     // objects with indefinite lengths, until first 'closed' from upper
       
   276     // level found.
       
   277 
       
   278     // Use object length, unless this is an object, whose total length is
       
   279     // not yet known. In that case use tag length (always 1) combined with
       
   280     // the amount of the length bytes.
       
   281     if ((add = aBerObject->ObjectLen()) == 0)
       
   282         {
       
   283         add = 1 + aBerObject->LenLen();
       
   284 
       
   285         // If new object is of indefinite length, still
       
   286         // add two more bytes for the end-of-content tag.
       
   287         if (aBerObject->Indefinite())
       
   288             {
       
   289             add += 2;
       
   290             }
       
   291         }
       
   292 
       
   293     berObjectLevel = aBerObject->Level();
       
   294 
       
   295     size = Count();
       
   296 
       
   297     for (index = size - 1; index >= 0; index--)
       
   298         {
       
   299         obj = At(index);
       
   300 
       
   301         if ((obj != 0) &&
       
   302             (obj->Level() < berObjectLevel) &&
       
   303             (obj->Indefinite()))
       
   304             {
       
   305             if ((obj->Type() == KBerSeq) ||
       
   306                 (obj->Type() == KBerSet) ||
       
   307                 (obj->Type() == KBerImplicitConstructed) ||
       
   308                 (obj->Type() == KBerExplicitConstructed))
       
   309                 {
       
   310                 if (obj->ObjectLen() == 0)
       
   311                     {
       
   312                     obj->AddToContentLen(add);
       
   313                     }
       
   314                 else
       
   315                     {
       
   316                     index = -1;                 // break;
       
   317                     }
       
   318                 }
       
   319             }
       
   320         }
       
   321     }
       
   322 
       
   323 // -----------------------------------------------------------------------------
       
   324 // CCrBerSet::CloseLastSeqOrSet
       
   325 // Finds last open indefinite length sequence
       
   326 // or set from this set at given level and closes it.
       
   327 // -----------------------------------------------------------------------------
       
   328 EXPORT_C TAny CCrBerSet::CloseLastSeqOrSet(TUint aLevel)
       
   329     {
       
   330     TInt    index = 0;
       
   331     TInt    size  = 0;
       
   332     TBerTag type  = KBerUnknown;
       
   333 
       
   334     CCrBer* obj = NULL;
       
   335 
       
   336     // Loop backwards through set and find first sequence or set with
       
   337     // indefinite length at same level. 'Close' it by setting its object
       
   338     // length.
       
   339     size = Count();
       
   340 
       
   341     for (index = size - 1; index >= 0; index--)
       
   342         {
       
   343         obj = At(index);
       
   344 
       
   345         if ((obj != 0) &&
       
   346             (obj->Level() == aLevel) &&
       
   347             (obj->Indefinite()))
       
   348             {
       
   349             type = obj->Type();
       
   350 
       
   351             if ((type == KBerSeq) ||
       
   352                 (type == KBerSet) ||
       
   353                 (type == KBerImplicitConstructed) ||
       
   354                 (type == KBerExplicitConstructed))
       
   355                 {
       
   356                 obj->SetObjectLen();
       
   357 
       
   358                 // Update upper objects with closed object.
       
   359                 Update(obj);
       
   360 
       
   361                 index = -1;             // break;
       
   362                 }
       
   363             }
       
   364         }
       
   365     }
       
   366 
       
   367 // -----------------------------------------------------------------------------
       
   368 //  Encoding
       
   369 // -----------------------------------------------------------------------------
       
   370     
       
   371 // -----------------------------------------------------------------------------
       
   372 // CCrBerSet::AppendBool
       
   373 // Write boolean object to CCrData.
       
   374 // Parameters:     Boolean value. ETrue or EFalse ( 0 / 1 ).
       
   375 // Return Values:  Error code
       
   376 // -----------------------------------------------------------------------------
       
   377 TInt CCrBerSet::AppendBoolL(TBool aBool)
       
   378     {
       
   379     TInt err = KErrNone;
       
   380     TBuf8<1> value;
       
   381 
       
   382     if (aBool)           
       
   383         {
       
   384         value.Append(KBerBooleanTrue);            
       
   385         }
       
   386     else                  
       
   387         {
       
   388         value.Append(KBerBooleanFalse);
       
   389         }
       
   390 
       
   391     err = AppendStringL(KBerBoolean, value);                       
       
   392 
       
   393     return err;
       
   394     }
       
   395 
       
   396 // -----------------------------------------------------------------------------
       
   397 // CCrBerSet::AppendInt
       
   398 // Write integer (0x02) object to CCrData. Parameter is either
       
   399 // a positive whole number, or a negative whole number, or zero.
       
   400 // value : from - 0xFFFFFFF to +0xFFF FFFF
       
   401 // Parameters:     Integer value e.g. 1024 or 0xABC. 
       
   402 // Return Values:  Error code
       
   403 // -----------------------------------------------------------------------------
       
   404 TInt CCrBerSet::AppendIntL(TInt aData)
       
   405     {
       
   406     TInt err = KErrNone;
       
   407     TBuf8<8> indexBuf;
       
   408     TUint len   = 0;
       
   409  
       
   410     HBufC8* buf = NULL;
       
   411     
       
   412     buf = HBufC8::NewLC(KIntBufSize);
       
   413     TPtr8 data  = buf->Des();
       
   414               
       
   415     if (aData >= 0)
       
   416         { 
       
   417         if (aData >= KBerLongLengthBit)
       
   418             {      
       
   419             while (aData > 0)                    
       
   420                 {
       
   421                 TInt8 byte;
       
   422                 byte = TInt8(aData);        // Take byte
       
   423                 indexBuf.Append(byte);      // and add it to indexBuf   
       
   424                 aData >>= KOctetWidth;      // Next byte
       
   425                 len++;                 
       
   426                 }       
       
   427             if (indexBuf[len-1] >= KBerLongLengthBit)   // if high order bit=1
       
   428                 {
       
   429                 indexBuf.Append(0);         // e.g. content 00 FF no FF 
       
   430                 len++;                      // (FF = neg num)
       
   431                 }
       
   432             }
       
   433         else                                // only one byte
       
   434             {
       
   435             indexBuf.Append(aData);         // so add directly
       
   436             len++;
       
   437             }
       
   438         }
       
   439    
       
   440     else
       
   441         {
       
   442         aData = -(aData + 1);               // convert to positive
       
   443 
       
   444         while ((aData > 0) || (len < 1))    // (len < 1) because -1 -> 0 ->FF            
       
   445             {
       
   446             TInt8 byte;
       
   447             byte = TInt8(aData);            // Take byte
       
   448             indexBuf.Append(~byte);         // and add complement to buf
       
   449             aData >>= KOctetWidth;          // Next byte
       
   450             len++;                 
       
   451             }
       
   452         if (indexBuf[len-1] < KBerLongLengthBit) // if high order bit=0
       
   453                 {
       
   454                 indexBuf.Append(0xFF);  
       
   455                 len++;                  
       
   456                 }
       
   457         }
       
   458 
       
   459     for (TInt i=len ; i > 0 ; i--)
       
   460         {
       
   461         data.Append(indexBuf[i - 1]);       // add data to buffer
       
   462         }
       
   463 
       
   464     err = AppendStringL(KBerInteger, data);        // write data to file
       
   465     
       
   466     CleanupStack::PopAndDestroy();
       
   467     buf = NULL;
       
   468 
       
   469     return err;
       
   470     }
       
   471 
       
   472 
       
   473 
       
   474 TInt CCrBerSet::AppendLongIntL(RInteger& aData)
       
   475     {
       
   476     TInt err = KErrNone;
       
   477     
       
   478     err = AppendStringL(KBerInteger, *aData.BufferLC());
       
   479     
       
   480     CleanupStack::PopAndDestroy(); 
       
   481 
       
   482     return err;
       
   483     }
       
   484 
       
   485 
       
   486 // -----------------------------------------------------------------------------
       
   487 // CCrBerSet::AppendNull
       
   488 // Write null (05 00) object to CCrData.
       
   489 // Parameters:     None
       
   490 // Return Values:  Error code
       
   491 // -----------------------------------------------------------------------------
       
   492 TInt CCrBerSet::AppendNull()
       
   493     {
       
   494     TInt err = KErrNone;
       
   495     TBuf8<2> data;
       
   496      
       
   497     data.Append(KBerNull);                      // Add Null tag 05
       
   498     data.Append(KBerNullContent);               // and null;    00
       
   499     
       
   500     err = iTarget->Write(data);                 // write data-buffer to CCrData 
       
   501     
       
   502     return err;
       
   503     }
       
   504 
       
   505 // -----------------------------------------------------------------------------
       
   506 // CCrBerSet::CloseIndefinite
       
   507 // Write end of indefinite length (add 00 00) to CCrData.
       
   508 // Return Values:  Error code
       
   509 // -----------------------------------------------------------------------------
       
   510 TInt CCrBerSet::CloseIndefinite()
       
   511     {   
       
   512     TInt err = KErrNone;
       
   513     TBuf8<2> data;                  
       
   514     data.Append(KBerEndOfContent);              // add end of indefinite length 
       
   515     data.Append(KBerEndOfContent);              // ( 00 00 )
       
   516     err = iTarget->Write(data);                 // write data-buffer to file
       
   517     
       
   518     return err;
       
   519     }
       
   520 
       
   521 // -----------------------------------------------------------------------------
       
   522 // CCrBerSet::AppendConstructed
       
   523 // Write constructed type to CCrData.
       
   524 // Parameters:     First param is type of constructed tag
       
   525 //                 e.g. 04 for octetS.  Second parameter is length or 0 for
       
   526 //                 indefinite length. e.g. if params are 4 and 0 --> 24 00
       
   527 // Return Values:  Error code
       
   528 // -----------------------------------------------------------------------------
       
   529 TInt CCrBerSet::AppendConstructedL(TBerTag aTag, TUint aLength)
       
   530     {
       
   531     TInt err    = KErrNone;
       
   532     HBufC8* buf = NULL; 
       
   533     
       
   534     buf = HBufC8::NewLC(8);
       
   535     TPtr8 data  = buf->Des();
       
   536 
       
   537     if (aTag < KBerConstructedBit)      // if tag not consist ConstructedBit
       
   538         {
       
   539         aTag += KBerConstructedBit;     // add ConstructedBit
       
   540         }
       
   541 
       
   542     if (aLength == KBerEndOfContent)            // indefinite length 
       
   543         {
       
   544         data.Append(aTag);                      // add Tag
       
   545         data.Append(KBerLongLengthBit);         // add indefinite length
       
   546         }
       
   547 
       
   548     else if (aLength < KBerLongLengthBit)       // if short len
       
   549         {
       
   550         data.Append(aTag);                      // add Tag    
       
   551         data.Append(aLength);                   // add len
       
   552         }
       
   553 
       
   554     else                                        // else we have long len
       
   555         {
       
   556         TBuf8<6> indexBuf;              
       
   557         TInt lenlen = 0;                        // number of length bytes
       
   558 
       
   559         while (aLength > 0)
       
   560             {
       
   561             TInt8 byte;           
       
   562             byte = TInt8(aLength);                
       
   563             indexBuf.Append(byte);
       
   564             aLength >>= KOctetWidth;
       
   565             lenlen++;
       
   566             }
       
   567 
       
   568         data.Append(aTag);                          // Add Tag 
       
   569         data.Append(lenlen + KBerLongLengthBit);    // Lenlen byte
       
   570             
       
   571         for (TInt i = lenlen ; i > 0 ; i--)
       
   572             {
       
   573             data.Append(indexBuf[i - 1]);       // length bytes
       
   574             }
       
   575         }                                           
       
   576         
       
   577     err = iTarget->Write(data);                 // write to CCrData
       
   578                   
       
   579     CleanupStack::PopAndDestroy();
       
   580     buf = NULL;
       
   581 
       
   582     return err;
       
   583     }
       
   584 
       
   585 // -----------------------------------------------------------------------------
       
   586 // CCrBerSet::AppendObjectId
       
   587 // Write object id object to CCrData.
       
   588 // Parameters:     Object ID. e.g. _L8("1.2.3.4.5"). Second parameter is 
       
   589 //                 true if you don't want write object to CCrData.
       
   590 // Return Values:  Error code (or length of object if aOnlyLen is true).
       
   591 // -----------------------------------------------------------------------------
       
   592 TInt CCrBerSet::AppendObjectIdL(const TDesC8& aString, TBool aOnlyLen)
       
   593     {
       
   594     TChar ch   = NULL;
       
   595     TUint num  = 0;
       
   596     TUint sum  = 0; 
       
   597     TInt index = 0;
       
   598     TInt len   = 0;
       
   599     TInt i     = 0;
       
   600     TInt start = 0;
       
   601     TInt err   = KErrNone;
       
   602     TBuf8<16> outbuf;
       
   603 
       
   604     HBufC8* fileBuf  = NULL;
       
   605     HBufC8* str = NULL;
       
   606 
       
   607     fileBuf = HBufC8::NewLC(aString.Length() + 1);
       
   608     str = aString.AllocLC();
       
   609   
       
   610     TPtr8 ptrFileBuf = fileBuf->Des();
       
   611     TPtr8 strptr = str->Des();
       
   612     
       
   613     // Check valid ( string must start "x.z.*", x < 10 and z < 10)
       
   614     if ((len = strptr.Locate('.')) == KObjectIDDot)            
       
   615         { 
       
   616         ch  = strptr[i];                            // take first number
       
   617         num = ch.GetNumericValue();                 // convert ascii to num                     
       
   618 
       
   619         // First byte = (first number * 40) + second number  
       
   620         sum = num * KObjectIDFirstFactor;           // num * 4                              
       
   621        
       
   622         strptr.Delete(start, len + 1);              // delete 'x.'
       
   623 
       
   624         // also second num must be smaller than 10
       
   625         if (!((strptr.Locate('.')) == KObjectIDDot))                   
       
   626             {
       
   627             err = KErrArgument;
       
   628             }
       
   629 
       
   630         while (strptr.Length() > 0)          
       
   631             {
       
   632             len = strptr.Locate('.');               // Find next dot
       
   633             
       
   634             if (len == KErrNotFound)                // if not found: take all 
       
   635                 {
       
   636                 len = strptr.Length();              // string len
       
   637                 } 
       
   638 
       
   639             for (i = 0; i < len; i++)               
       
   640                 {
       
   641                 ch  = strptr[i];
       
   642                 num = ch.GetNumericValue();        
       
   643                 sum = sum * KObjectIDSecondFactor + num;    // sum * 10 + num           
       
   644                 num = 0;
       
   645                 }
       
   646        
       
   647             strptr.Delete(start, len + 1);          // delete also dot
       
   648 
       
   649             for (index = 0; (sum >= KBerLongLengthBit); index++)
       
   650                 {   
       
   651                 outbuf.Append(sum % KBerLongLengthBit);        // add remainder 
       
   652                 sum = (sum - outbuf[index]) / KBerLongLengthBit;// take new 
       
   653                 }
       
   654 
       
   655             outbuf.Append(sum);
       
   656 
       
   657             for (; index >= 0 ; index--)
       
   658                 {
       
   659                 if (!index)                      
       
   660                     {
       
   661                     ptrFileBuf.Append(outbuf[index]);
       
   662                     }
       
   663                 else                        
       
   664                     {
       
   665                     ptrFileBuf.Append(outbuf[index] + KBerLongLengthBit);
       
   666                     }   
       
   667                 }
       
   668             
       
   669             sum = 0;
       
   670             outbuf.Delete(start, outbuf.Length());       
       
   671             }
       
   672         
       
   673         if ((!aOnlyLen && ptrFileBuf.Length()) && (err == KErrNone))
       
   674             {
       
   675             err = AppendStringL(KBerOid, ptrFileBuf);   // write object to CCrData
       
   676             }
       
   677         else if (err == KErrNone)
       
   678             {
       
   679             len = ptrFileBuf.Length();              // return object length 
       
   680             err = len;
       
   681             }                                       // else return error
       
   682         }
       
   683     else                                            
       
   684         {                                           
       
   685         err = KErrArgument;                         // return argument error
       
   686         }
       
   687 
       
   688     CleanupStack::PopAndDestroy(2);                  // delete fileBuf, str;
       
   689     return err;                                     // return error code
       
   690     }
       
   691 
       
   692 // -----------------------------------------------------------------------------
       
   693 // CCrBerSet::AppendString
       
   694 // Write string object to CCrData.
       
   695 // Parameters:     Object type (tag) and string. e.g. (KBerIA5S, _L("Hello"))      
       
   696 // Return Values:  Error code
       
   697 // -----------------------------------------------------------------------------
       
   698 TInt CCrBerSet::AppendStringL(TBerTag aTag, const TDesC8& aString)
       
   699     {
       
   700     TInt err = KErrNone;
       
   701     TInt len = aString.Length();
       
   702 
       
   703     HBufC8* buf  = NULL;
       
   704     
       
   705     buf = HBufC8::NewLC(KBerShortLen + LEN_BYTES_MAX);
       
   706     TPtr8   data = buf->Des();
       
   707  
       
   708     if (len < KBerLongLengthBit)                    // If short len:
       
   709         {
       
   710         data.Append(aTag);                          // Add Tag
       
   711         data.Append(len);                           // length 
       
   712         }                                                  
       
   713     else                                            // Else long
       
   714         {
       
   715         TBuf8<8> indexBuf;
       
   716         TUint lenlen = 0;                           // number of len bytes
       
   717               
       
   718         while (len > 0)
       
   719             {
       
   720             TInt8 byte;                             
       
   721             byte = TInt8(len);                      // Take byte
       
   722             indexBuf.Append(byte);                  // append it to buf
       
   723             len >>= KOctetWidth;                    // next byte
       
   724             lenlen++;                                                        
       
   725             }
       
   726 
       
   727         data.Append(aTag);                          // Add tag
       
   728         data.Append(lenlen + KBerLongLengthBit);    // now add lenlen byte
       
   729                                                     // 0x80 + lenlen
       
   730 
       
   731         for (TInt i=lenlen ; i > 0 ; i--)
       
   732             {
       
   733             data.Append(indexBuf[i - 1]);           // add len bytes
       
   734             }
       
   735 
       
   736         len = aString.Length();
       
   737         }
       
   738 
       
   739     err = iTarget->Write(data);                     // write buffer to file
       
   740     err = iTarget->Write(aString);                     // write buffer to file
       
   741                   
       
   742     CleanupStack::PopAndDestroy();                  // delete buf;                         
       
   743     buf = NULL;    
       
   744 
       
   745     return err;
       
   746     }
       
   747  
       
   748 // -----------------------------------------------------------------------------
       
   749 // CCrBerSet::AppendString
       
   750 // Write string object to CCrData.
       
   751 // Parameters:     Object type (tag) and CCrData      
       
   752 // Return Values:  Error code
       
   753 // -----------------------------------------------------------------------------
       
   754 TInt CCrBerSet::AppendStringL(TBerTag aTag, CCrData* const aData)
       
   755     {
       
   756     TInt err = KErrNone;
       
   757     TInt len = 0;
       
   758     aData->Size(len);
       
   759 
       
   760     HBufC8* buf  = NULL;
       
   761     buf = HBufC8::NewLC(KBerShortLen + LEN_BYTES_MAX);
       
   762     TPtr8 data = buf->Des();
       
   763  
       
   764     if (len < KBerLongLengthBit)                    // If short len:
       
   765         {
       
   766         data.Append(aTag);                          // Add Tag
       
   767         data.Append(len);                           // length 
       
   768 
       
   769         }                                                  
       
   770     else                                            // Else long
       
   771         {
       
   772         TBuf8<8> indexBuf;
       
   773         TUint lenlen = 0;                           // number of len bytes
       
   774               
       
   775         while (len > 0)
       
   776             {
       
   777             TInt8 byte;                             
       
   778             byte = TInt8(len);                      // Take byte
       
   779             indexBuf.Append(byte);                  // append it to buf
       
   780             len >>= KOctetWidth;                    // next byte
       
   781             lenlen++;                                                        
       
   782             }
       
   783 
       
   784         data.Append(aTag);                          // Add tag
       
   785         data.Append(lenlen + KBerLongLengthBit);    // now add lenlen byte
       
   786                                                     // 0x80 + lenlen
       
   787 
       
   788         for (TInt i=lenlen ; i > 0 ; i--)
       
   789             {
       
   790             data.Append(indexBuf[i - 1]);           // add len bytes
       
   791             }
       
   792 
       
   793         aData->Size(len);
       
   794 
       
   795         }
       
   796 
       
   797     err = iTarget->Write(data);                     // write buffer to file
       
   798     
       
   799     // Write aData to iTarget
       
   800     HBufC8* tempBuf = tempBuf = HBufC8::NewLC(KBufSize);
       
   801     
       
   802     // write aData to iTarget in loop.
       
   803     TPtr8 ptr = tempBuf->Des();
       
   804     TInt size = 0;
       
   805     aData->Size(size);
       
   806     TInt left = size;
       
   807     TInt handleThisTime = 0;
       
   808     TInt handled = 0;
       
   809 
       
   810     while (left > 0)
       
   811         {
       
   812         if (left > KBufSize)
       
   813             {
       
   814             handleThisTime = KBufSize;
       
   815             }
       
   816         else
       
   817             {
       
   818             handleThisTime = left;
       
   819             }
       
   820         aData->Read(handled, ptr, handleThisTime);
       
   821         iTarget->Write(ptr);
       
   822         ptr.Zero();
       
   823 
       
   824         handled = handled + handleThisTime;
       
   825         left = size - handled;
       
   826         }
       
   827 
       
   828     CleanupStack::PopAndDestroy(2);
       
   829     return err;
       
   830     }
       
   831  
       
   832 // -----------------------------------------------------------------------------
       
   833 // CCrBerSet::AppendBerEncodedObject
       
   834 // Write BER encoded object to CCrData.
       
   835 // Parameters:     Buffer containing BER encoded object.      
       
   836 // Return Values:  Error code
       
   837 // -----------------------------------------------------------------------------
       
   838 TInt CCrBerSet::AppendBerEncodedObject(const TDesC8& aString)
       
   839     {
       
   840     TInt err = KErrNone;
       
   841 
       
   842     err = iTarget->Write(aString); // write buffer to file
       
   843                   
       
   844     return err;
       
   845     }
       
   846  
       
   847 
       
   848 // -----------------------------------------------------------------------------
       
   849 // CCrBerSet::CreateBoolL
       
   850 // Function creates Ber encoded boolean object (CCrBer object).
       
   851 // Write a object to CCrData (file) by Flush(..) 
       
   852 // Parameters:     Value of the object
       
   853 // Return Values:  None 
       
   854 // -----------------------------------------------------------------------------
       
   855 EXPORT_C TAny CCrBerSet::CreateBoolL(TBool aValue)
       
   856     {
       
   857     CCrBer* newObject = CCrBer::NewLC(iLevel);
       
   858     newObject->CreateBool(aValue);
       
   859     
       
   860     AppendL(newObject);              // add to set
       
   861     
       
   862     CleanupStack::Pop();
       
   863     }
       
   864 
       
   865 // -----------------------------------------------------------------------------
       
   866 // CCrBerSet::CreateIntL
       
   867 // Function creates Ber encoded integer object (CCrBer object).
       
   868 // Write a object to CCrData (file) by Flush(..) 
       
   869 // Parameters:     Value of the object
       
   870 // Return Values:  None 
       
   871 // -----------------------------------------------------------------------------
       
   872 EXPORT_C TAny CCrBerSet::CreateIntL(TInt aValue)
       
   873     {
       
   874     CCrBer* newObject = CCrBer::NewLC(iLevel);
       
   875     newObject->CreateInt(aValue);
       
   876     
       
   877     AppendL(newObject);              // add to set
       
   878     
       
   879     CleanupStack::Pop();
       
   880     }
       
   881 
       
   882 
       
   883 EXPORT_C TAny CCrBerSet::CreateLongIntL(RInteger& aValue)
       
   884     {
       
   885     CCrBer* newObject = CCrBer::NewLC(iLevel);
       
   886     
       
   887     newObject->CreateLongInt(aValue);
       
   888     
       
   889     AppendL(newObject);              // add to set
       
   890     
       
   891     CleanupStack::Pop();
       
   892     }
       
   893 
       
   894 
       
   895 // -----------------------------------------------------------------------------        
       
   896 // CCrBerSet::CreateNullL
       
   897 // Function creates Ber encoded null object (CCrBer object).
       
   898 // Write a object to CCrData (file) by Flush(..) 
       
   899 // -----------------------------------------------------------------------------
       
   900 EXPORT_C TAny CCrBerSet::CreateNullL()
       
   901     {
       
   902     CCrBer* newObject = CCrBer::NewLC(iLevel);
       
   903     newObject->CreateNull();                
       
   904     
       
   905     AppendL(newObject);              // add to set
       
   906     
       
   907     CleanupStack::Pop();
       
   908     }
       
   909 
       
   910 // -----------------------------------------------------------------------------
       
   911 // CCrBerSet::CreateIA5L
       
   912 // Function creates Ber encoded IA5 string object (CCrBer object).
       
   913 // Write a object to CCrData  by Flush(..) 
       
   914 // Parameters:     IA5 string
       
   915 // -----------------------------------------------------------------------------
       
   916 EXPORT_C TAny CCrBerSet::CreateIA5L(TDesC8& aString)
       
   917     {
       
   918     CCrBer* newObject = CCrBer::NewLC(iLevel);
       
   919     newObject->CreateString(KBerIA5S, &aString);
       
   920     
       
   921     AppendL(newObject);              // add to set
       
   922 
       
   923     CleanupStack::Pop();
       
   924     }
       
   925 
       
   926 
       
   927 
       
   928 // -----------------------------------------------------------------------------
       
   929 // CCrBerSet::CreateNumericL
       
   930 // Function creates Ber encoded Numeric string object (CCrBer object).
       
   931 // Write a object to CCrData (file) by Flush(..) 
       
   932 // Parameters:     Numeric string
       
   933 // -----------------------------------------------------------------------------
       
   934 EXPORT_C TAny CCrBerSet::CreateNumericL(TDesC8& aString)
       
   935     {
       
   936     CCrBer* newObject = CCrBer::NewLC(iLevel);
       
   937     newObject->CreateString(KBerNumS, &aString);
       
   938         
       
   939     AppendL(newObject);              // add to set
       
   940 
       
   941     CleanupStack::Pop();
       
   942     }
       
   943 
       
   944 // -----------------------------------------------------------------------------
       
   945 // CCrBerSet::CreatePrintableL
       
   946 // Function creates Ber encoded Printable string object (CCrBer object).
       
   947 // Write a object to CCrData (file) by Flush(..) 
       
   948 // Parameters:     Printable string
       
   949 // -----------------------------------------------------------------------------
       
   950 EXPORT_C TAny CCrBerSet::CreatePrintableL(TDesC8& aString)
       
   951     {
       
   952     CCrBer* newObject = CCrBer::NewLC(iLevel);
       
   953     newObject->CreateString(KBerPrS, &aString);
       
   954     AppendL(newObject);              // add to set
       
   955 
       
   956     CleanupStack::Pop();
       
   957     }
       
   958 
       
   959 // -----------------------------------------------------------------------------
       
   960 // CCrBerSet::CreateT61L
       
   961 // Function creates Ber encoded T61 string object (CCrBer object).
       
   962 // Write a object to CCrData (file) by Flush(..) 
       
   963 // Parameters:     T61 string (= a teletext string)
       
   964 // -----------------------------------------------------------------------------
       
   965 EXPORT_C TAny CCrBerSet::CreateT61L(TDesC8& aString)
       
   966     {
       
   967     CCrBer* newObject = CCrBer::NewLC(iLevel);
       
   968     newObject->CreateString(KBerT61S, &aString);
       
   969     AppendL(newObject);              // add to set
       
   970 
       
   971     CleanupStack::Pop();
       
   972     }
       
   973 
       
   974 // -----------------------------------------------------------------------------
       
   975 // CCrBerSet::CreateVideoTexL
       
   976 // Function creates Ber encoded Video text object (CCrBer object).
       
   977 // Write a object to CCrData (file) by Flush(..) 
       
   978 // Parameters:     VideoTex string
       
   979 // -----------------------------------------------------------------------------
       
   980 EXPORT_C TAny CCrBerSet::CreateVideoTexL(TDesC8& aString)
       
   981     {
       
   982     CCrBer* newObject = CCrBer::NewLC(iLevel);
       
   983     newObject->CreateString(KBerVideoS, &aString);
       
   984     AppendL(newObject);              // add to set
       
   985 
       
   986     CleanupStack::Pop();
       
   987     }
       
   988 
       
   989 // -----------------------------------------------------------------------------
       
   990 // CCrBerSet::CreateUTCL
       
   991 // Function creates Ber encoded UTC time object (CCrBer object).
       
   992 // Write a object to CCrData (file) by Flush(..) 
       
   993 // Parameters:     UTC time (string)
       
   994 // -----------------------------------------------------------------------------
       
   995 EXPORT_C TAny CCrBerSet::CreateUTCL(TDesC8& aString)
       
   996     {
       
   997     CCrBer* newObject = CCrBer::NewLC(iLevel);
       
   998     newObject->CreateString(KBerUtc, &aString);
       
   999     AppendL(newObject);              // add to set
       
  1000 
       
  1001     CleanupStack::Pop();
       
  1002     }
       
  1003 
       
  1004 // -----------------------------------------------------------------------------
       
  1005 // CCrBerSet::CreateGenTimeL
       
  1006 // Function creates Ber encoded generalised time object (CCrBer object).
       
  1007 // Write a object to CCrData (file) by Flush(..) 
       
  1008 // Parameters:     Generalised time (string)
       
  1009 // -----------------------------------------------------------------------------
       
  1010 EXPORT_C TAny CCrBerSet::CreateGenTimeL(TDesC8& aString)
       
  1011     {
       
  1012     CCrBer* newObject = CCrBer::NewLC(iLevel);
       
  1013     newObject->CreateString(KBerGenTime, &aString);
       
  1014     AppendL(newObject);              // add to set
       
  1015 
       
  1016     CleanupStack::Pop();
       
  1017     }
       
  1018 
       
  1019 // -----------------------------------------------------------------------------
       
  1020 // CCrBerSet::CreateGraphicalL
       
  1021 // Function creates Ber encoded graphical string object (CCrBer object).
       
  1022 // Write a object to CCrData (file) by Flush(..) 
       
  1023 // Parameters:     Graphical string
       
  1024 // -----------------------------------------------------------------------------
       
  1025 EXPORT_C TAny CCrBerSet::CreateGraphicalL(TDesC8& aString)
       
  1026     {
       
  1027     CCrBer* newObject = CCrBer::NewLC(iLevel);
       
  1028     newObject->CreateString(KBerGraphS, &aString);
       
  1029     AppendL(newObject);              // add to set
       
  1030 
       
  1031     CleanupStack::Pop();
       
  1032     }
       
  1033 
       
  1034 // -----------------------------------------------------------------------------
       
  1035 // CCrBerSet::CreateVisibleL
       
  1036 // Function creates Ber encoded visible string object (CCrBer object).
       
  1037 // Write a object to CCrData (file) by Flush(..) 
       
  1038 // Parameters:     Visible string
       
  1039 // -----------------------------------------------------------------------------
       
  1040 EXPORT_C TAny CCrBerSet::CreateVisibleL(TDesC8& aString)
       
  1041     {
       
  1042     CCrBer* newObject = CCrBer::NewLC(iLevel);
       
  1043     newObject->CreateString(KBerVisibleS, &aString);    // save type & pointer
       
  1044     AppendL(newObject);              // add to set
       
  1045 
       
  1046     CleanupStack::Pop();
       
  1047     }
       
  1048 
       
  1049 // -----------------------------------------------------------------------------
       
  1050 // CCrBerSet::CreateGeneralL
       
  1051 // Function creates Ber encoded general string object (CCrBer object).
       
  1052 // Write a object to CCrData (file) by Flush(..) 
       
  1053 // Parameters:     Generalised string
       
  1054 // -----------------------------------------------------------------------------
       
  1055 EXPORT_C TAny CCrBerSet::CreateGeneralL(TDesC8& aString)
       
  1056     {
       
  1057     CCrBer* newObject = CCrBer::NewLC(iLevel);
       
  1058     newObject->CreateString(KBerGeneralS, &aString);    // save type & pointer
       
  1059     AppendL(newObject);              // add to set
       
  1060     CleanupStack::Pop();
       
  1061     }
       
  1062 
       
  1063 // -----------------------------------------------------------------------------
       
  1064 // CCrBerSet::CreateOctetL
       
  1065 // Function creates Ber encoded octet string object (CCrBer object).
       
  1066 // Write a object to CCrData (file) by Flush(..) 
       
  1067 // Parameters:     Octet string
       
  1068 // -----------------------------------------------------------------------------
       
  1069 EXPORT_C TAny CCrBerSet::CreateOctetL(TDesC8& aString)
       
  1070     {
       
  1071     CCrBer* newObject = CCrBer::NewLC(iLevel);
       
  1072     newObject->CreateString(KBerOctetString, &aString); // save type & pointer
       
  1073     AppendL(newObject);              // add to set
       
  1074 
       
  1075     CleanupStack::Pop();
       
  1076     }
       
  1077 
       
  1078 // -----------------------------------------------------------------------------
       
  1079 // CCrBerSet::CreateOctetL
       
  1080 // Function creates Ber encoded octet string object (CCrBer object).
       
  1081 // Write a object to CCrData (file) by Flush(..) 
       
  1082 // Parameters:     CCrData* 
       
  1083 // -----------------------------------------------------------------------------
       
  1084 EXPORT_C TAny CCrBerSet::CreateOctetL(CCrData* aData)
       
  1085     {
       
  1086     CCrBer* newObject = CCrBer::NewLC(iLevel);
       
  1087     newObject->CreateString(KBerOctetString, aData); // save type & pointer
       
  1088     AppendL(newObject);              // add to set
       
  1089 
       
  1090     CleanupStack::Pop();
       
  1091     }
       
  1092 
       
  1093 // -----------------------------------------------------------------------------
       
  1094 // CCrBerSet::CreateOIdL
       
  1095 // Function creates Ber encoded object identifier object (CCrBer object).
       
  1096 // Write a object to CCrData (file) by Flush(..) 
       
  1097 // Parameters:     object identifier content e.g.(_L8("1.2.3.4445"))
       
  1098 // -----------------------------------------------------------------------------
       
  1099 EXPORT_C TAny CCrBerSet::CreateOIdL(TDesC8& aString)
       
  1100     {
       
  1101     CCrBer* newObject = CCrBer::NewLC(iLevel);
       
  1102     newObject->CreateOIdL(&aString);         // save type and pointer to data
       
  1103 
       
  1104     AppendL(newObject);              // add to set
       
  1105 
       
  1106     CleanupStack::Pop();
       
  1107     }
       
  1108 
       
  1109 // -----------------------------------------------------------------------------
       
  1110 // CCrBerSet::CreateSeqStartL
       
  1111 // Function creates start of sequence (0x30). End this by EndL().
       
  1112 // Parameters:     True for definite length sequence, false for indefinite
       
  1113 //                 length 
       
  1114 // -----------------------------------------------------------------------------
       
  1115 EXPORT_C TAny CCrBerSet::CreateSeqStartL(TBool aDefinite)
       
  1116     {
       
  1117     CCrBer* newObject = CCrBer::NewLC(++iLevel);
       
  1118     newObject->CreateStart(KBerSeq, aDefinite); 
       
  1119         
       
  1120     if (iLevel > iMaxLevel) 
       
  1121         {
       
  1122         iMaxLevel = iLevel;                 // iMaxLevel is used in Flush(..)
       
  1123         }
       
  1124 
       
  1125     AppendL(newObject);              // add to set
       
  1126 
       
  1127     CleanupStack::Pop();
       
  1128     }
       
  1129 
       
  1130 
       
  1131 
       
  1132 // -----------------------------------------------------------------------------
       
  1133 // CCrBerSet::CreateSetStartL
       
  1134 // Start set (31 xx) object. End this set by EndL(). 
       
  1135 // Parameters:     Parameter is true for definite length, false for
       
  1136 //                 indefinite length. 
       
  1137 // -----------------------------------------------------------------------------
       
  1138 EXPORT_C TAny CCrBerSet::CreateSetStartL(TBool aDefinite)
       
  1139     {
       
  1140     CCrBer* newObject = CCrBer::NewLC(++iLevel);
       
  1141     newObject->CreateStart(KBerSet, aDefinite);   
       
  1142         
       
  1143     if (iLevel > iMaxLevel) 
       
  1144         {
       
  1145         iMaxLevel = iLevel;                 // iMaxLevel is used in Flush(..)
       
  1146         }
       
  1147 
       
  1148     AppendL(newObject);                     // add to set
       
  1149 
       
  1150     CleanupStack::Pop();
       
  1151     }
       
  1152 
       
  1153 // -----------------------------------------------------------------------------
       
  1154 // CCrBerSet::CreateConstructedStartL
       
  1155 // Function creates start of constructed type object. End this by EndL(). 
       
  1156 // Parameters:     First parameter is object type (tag), Second parameter is 
       
  1157 //                 true for definite length, false for indefinite length. 
       
  1158 // -----------------------------------------------------------------------------
       
  1159 EXPORT_C TAny CCrBerSet::CreateConstructedStartL(TBerTag aTag, TBool aDefinite)
       
  1160     {
       
  1161     CCrBer* newObject = CCrBer::NewLC(++iLevel);
       
  1162     if (aTag < KBerConstructed)
       
  1163         {
       
  1164         aTag += KBerConstructedBit;         // e.g. 0x04 --> 0x24
       
  1165         }
       
  1166 
       
  1167     newObject->CreateStart(aTag, aDefinite);   
       
  1168         
       
  1169     if (iLevel > iMaxLevel) 
       
  1170         {
       
  1171         iMaxLevel = iLevel;                 // iMaxLevel is used in Flush(..)
       
  1172         }
       
  1173     AppendL(newObject);              // add to set
       
  1174     CleanupStack::Pop();
       
  1175     }
       
  1176 
       
  1177 
       
  1178 
       
  1179 // -----------------------------------------------------------------------------
       
  1180 // CCrBerSet::CreateEndL
       
  1181 // Function close last constructed (e.g. seq) object. 
       
  1182 // (definite or indefinite). 
       
  1183 // -----------------------------------------------------------------------------
       
  1184 EXPORT_C TAny CCrBerSet::CreateEndL()
       
  1185     {
       
  1186     CCrBer* newObject = CCrBer::NewLC(iLevel--);
       
  1187     newObject->CreateEnd();
       
  1188 
       
  1189     AppendL(newObject);              // add to set
       
  1190     CleanupStack::Pop();
       
  1191     }
       
  1192 
       
  1193 // -----------------------------------------------------------------------------
       
  1194 // CCrBerSet::CreateBEREncodedObjectL
       
  1195 // This fuction can be used to create a BER object
       
  1196 // from buffer, which already contains a full BER
       
  1197 // encoded object.
       
  1198 // Parameters:     Buffer containing BER encoded object.
       
  1199 // -----------------------------------------------------------------------------
       
  1200 EXPORT_C TAny CCrBerSet::CreateBEREncodedObjectL(TDesC8& aString)
       
  1201     {
       
  1202     CCrBer* newObject = CCrBer::NewLC(iLevel);
       
  1203     newObject->CreateBEREncodedObject(&aString); // save pointer
       
  1204     AppendL(newObject);                          // add to set
       
  1205     CleanupStack::Pop();                         // newObject
       
  1206     }
       
  1207 
       
  1208 // -----------------------------------------------------------------------------
       
  1209 // CCrBerSet::Flush
       
  1210 // Function writes all created crber objects (which are AppendL to set)
       
  1211 // to file. Function also set length for definite lengths.
       
  1212 // Call this function then crberSet is ready (all berObjects are given).
       
  1213 // Parameters:     Reference to target CCrData (file)
       
  1214 // Return Values:  Number of written objects or error code. 
       
  1215 // -----------------------------------------------------------------------------
       
  1216 EXPORT_C TInt CCrBerSet::FlushL(CCrData* aTarget)
       
  1217     {
       
  1218     TInt index = 0;
       
  1219     TInt i = 0;
       
  1220     TUint level = 0;
       
  1221     TUint8 type = 0;
       
  1222     TInt err = KErrNone;
       
  1223     CCrBer* berObject = NULL;
       
  1224     CCrBer* newObject = NULL;
       
  1225     TInt size = Count();                    // number of the ber-objects
       
  1226 
       
  1227     iTarget = aTarget;
       
  1228 
       
  1229     if (iLevel || !size)                    // end count != start count
       
  1230         {                                   // or if no CrBer objects 
       
  1231         return KErrArgument;
       
  1232         }
       
  1233     
       
  1234     // Set definite lengths  
       
  1235     for (level = iMaxLevel; level > 0; level--)     // check levels (except 0)
       
  1236         {                                           
       
  1237         for (index = 0 ; index < size ; index++)    // all objects
       
  1238             {
       
  1239             berObject = At(index);                  
       
  1240         
       
  1241             if ((berObject->Type() >= KBerConstructed) &&   // Constructed 
       
  1242                 (!berObject->ObjectLen())              &&   // definite len
       
  1243                 (berObject->Level() == level))              // same level
       
  1244                 {
       
  1245                 for (i = index + 1; i < size; i++)
       
  1246                     {
       
  1247                     newObject = At(i);
       
  1248  
       
  1249                     if ((newObject->Type() == KBerEndOfContent) &&
       
  1250                         (newObject->Level() == berObject->Level()) &&
       
  1251                         (newObject->Value() >= 0))
       
  1252                         {
       
  1253                         berObject->SetObjLenWithOutContent(
       
  1254                             berObject->ContentLen());
       
  1255                         newObject->SetValue(-1);    // this end is now used
       
  1256                         i = size;                   // end found, go away
       
  1257                         }
       
  1258                     else                                
       
  1259                         {
       
  1260                         berObject->AddToContentLen(newObject->ObjectLen());
       
  1261                         }                       
       
  1262                     }
       
  1263                 }
       
  1264             }
       
  1265         }
       
  1266 
       
  1267 
       
  1268     // Write objects to file
       
  1269     for (index = 0; index < size; index++)
       
  1270         {
       
  1271         berObject = At(index);
       
  1272         type = berObject->Type();
       
  1273 
       
  1274         if (type > KBerConstructed && type != KBerEncodedObject )
       
  1275             {
       
  1276             type = KBerConstructed;
       
  1277             }
       
  1278         
       
  1279         switch (type)
       
  1280             {
       
  1281             case KBerBoolean:
       
  1282                 {
       
  1283                 err += AppendBoolL(berObject->Value());
       
  1284                 break;
       
  1285                 }
       
  1286             case KBerInteger:
       
  1287                 {
       
  1288                 if (!berObject->Value() && (berObject->GetBigInt() != NULL))
       
  1289                     {
       
  1290 					RInteger integer = berObject->GetBigInt();
       
  1291                     err += AppendLongIntL(integer);
       
  1292                     }
       
  1293                 else
       
  1294                     {
       
  1295                     err += AppendIntL(berObject->Value());
       
  1296                     }
       
  1297                 break;
       
  1298                 }  
       
  1299             case KBerNull:
       
  1300                 {
       
  1301                 err += AppendNull();
       
  1302                 break;
       
  1303                 }
       
  1304             case KBerOid:
       
  1305                 {
       
  1306                 err += AppendObjectIdL(*berObject->ValuePtr());
       
  1307                 break;
       
  1308                 }
       
  1309             case KBerBitString:
       
  1310             case KBerOctetString:             
       
  1311 		    case KBerNumS:
       
  1312             case KBerPrS:
       
  1313             case KBerT61S:
       
  1314 		    case KBerVideoS:
       
  1315             case KBerIA5S:
       
  1316             case KBerUtc:
       
  1317 		    case KBerGenTime:                                
       
  1318 		    case KBerGraphS: 
       
  1319 		    case KBerVisibleS:
       
  1320 		    case KBerGeneralS:
       
  1321                 {
       
  1322                 CCrData* tempData = berObject->Data();
       
  1323                 if (tempData != NULL)
       
  1324                     {
       
  1325                     err += AppendStringL((berObject->Type()),
       
  1326                                     (berObject->Data()));
       
  1327                     }
       
  1328                 else
       
  1329                     {
       
  1330                     err += AppendStringL((berObject->Type()),
       
  1331                                     (*berObject->ValuePtr()));
       
  1332                     }
       
  1333                 break;
       
  1334                 }
       
  1335             case KBerSeq:
       
  1336             case KBerSet:
       
  1337             case KBerConstructed:
       
  1338                 {
       
  1339                 err += AppendConstructedL((berObject->Type()), 
       
  1340                                          (berObject->ContentLen()));
       
  1341                 break;
       
  1342                 }
       
  1343             case KBerEncodedObject:
       
  1344                 {
       
  1345                 err += AppendBerEncodedObject(
       
  1346                     (*berObject->ValuePtr()));
       
  1347                 break;
       
  1348                 }
       
  1349             case KBerEndOfContent:
       
  1350                 {
       
  1351                 if (!berObject->Value())            // Indefinite len
       
  1352                     {   
       
  1353                     err += CloseIndefinite();
       
  1354                     }
       
  1355                 break;
       
  1356                 }
       
  1357             }
       
  1358         }
       
  1359     if (err < KErrNone)
       
  1360         {
       
  1361         return KErrGeneral;
       
  1362         }
       
  1363     else    
       
  1364         {
       
  1365         return size;
       
  1366         }
       
  1367     }