userlibandfileserver/fileserver/sfsrv/cl_parse.cpp
changeset 9 96e5fb8b040d
child 21 e7d2d738d3c2
equal deleted inserted replaced
-1:000000000000 9:96e5fb8b040d
       
     1 // Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of the License "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // f32\sfsrv\cl_parse.cpp
       
    15 // 
       
    16 //
       
    17 
       
    18 #include "cl_std.h"
       
    19 
       
    20 const TInt KLexComponents=4;
       
    21 const TInt KLexNames=3;
       
    22 
       
    23 
       
    24 
       
    25 
       
    26 EXPORT_C TParseBase::TParseBase()
       
    27 	: iWild(0)
       
    28 /**
       
    29 Default constructor.
       
    30 */
       
    31 	{
       
    32 
       
    33 	Mem::FillZ(&iField[0],sizeof(iField));
       
    34 	}
       
    35 
       
    36 
       
    37 
       
    38 
       
    39 TInt TParseBase::ParseDrive(TLex& aName,TBool& aDone)
       
    40 //
       
    41 // Parse the drive name.
       
    42 //
       
    43 	{
       
    44 
       
    45 	TPtrC d=aName.RemainderFromMark();
       
    46 	if (d.Length()<2 || d[1]!=KDriveDelimiter)
       
    47 		return(KErrNone);	//must be Drive delimeter and longer that tow to be valid drive
       
    48 	TCharF c=d[0];
       
    49 	if (!c.IsAlpha())		//must be alphaber letter 
       
    50 		return(KErrBadName);
       
    51 	if (!aDone)
       
    52 		{
       
    53 		if(iMod)
       
    54 			NameBuf()+=d.Left(2);
       
    55 		aDone=ETrue;
       
    56 		}
       
    57 	aName.SkipAndMark(2);
       
    58 	return(KErrNone);
       
    59 	}
       
    60 
       
    61 TInt TParseBase::ParsePath(TLex& aName,TBool& aDone)
       
    62 //
       
    63 // Parse the path.
       
    64 //
       
    65 	{
       
    66 
       
    67 	TPtrC d=aName.RemainderFromMark();
       
    68 	if (d.Length() && d[0]!=KPathDelimiter)
       
    69 		return(KErrNone); // Require first char of path to be a '\'
       
    70 	TInt n=d.LocateReverse(KPathDelimiter)+1;
       
    71 	if (n && !aDone)
       
    72 		{
       
    73 		if(iMod)
       
    74 			{
       
    75 			if (NameBuf().Length()+n>KMaxFileName)
       
    76 				return(KErrBadName);
       
    77 			NameBuf()+=d.Left(n);
       
    78 			}
       
    79 		aDone=ETrue;
       
    80 		}
       
    81 	aName.SkipAndMark(n);
       
    82 	return(KErrNone);
       
    83 	}
       
    84 
       
    85 LOCAL_C TBool IsSpace(const TDesC& aDes)
       
    86 //
       
    87 // Returns ETrue if aDes only contains spaces or is zero length
       
    88 //
       
    89 	{
       
    90 
       
    91 	TInt len=aDes.Length();
       
    92 	for (TInt i=0;i<len;i++)
       
    93 		{
       
    94 		TChar txt=aDes[i];
       
    95 		if (!txt.IsSpace())
       
    96 			return(EFalse);
       
    97 		}
       
    98 	return(ETrue);
       
    99 	}
       
   100 
       
   101 TInt TParseBase::ParseName(TLex& aName,TBool& aDone)
       
   102 //
       
   103 // Parse the name.
       
   104 //
       
   105 	{
       
   106 
       
   107 	TPtrC d=aName.RemainderFromMark();
       
   108 	if (d.Locate(KPathDelimiter)!=KErrNotFound)
       
   109 		return(KErrBadName); // Illegal name - filenames cannot contain a '\'
       
   110 	TInt n=d.LocateReverse(KExtDelimiter);
       
   111 	if (n==KErrNotFound)
       
   112 		{
       
   113 		n=d.Length();
       
   114 		if (IsSpace(d.Left(n)))
       
   115 			return(KErrNone);
       
   116 		}
       
   117 	TPtrC v=d.Left(n);
       
   118 	if (n && !aDone)
       
   119 		{
       
   120 		if (v.Locate(KMatchOne)!=KErrNotFound)	//	Found ? in the name
       
   121 			iWild|=(EWildName|EWildEither|EWildIsKMatchOne);		
       
   122 		if (v.Locate(KMatchAny)!=KErrNotFound)	//	Found * in the name
       
   123 			iWild|=(EWildName|EWildEither|EWildIsKMatchAny);		
       
   124 		if(iMod)
       
   125 			{
       
   126 			if (NameBuf().Length()+n>KMaxFileName)	
       
   127 				return(KErrBadName);
       
   128 			NameBuf()+=v;
       
   129 			if (n==d.Length())
       
   130 				NameBuf().TrimRight();
       
   131 			}
       
   132 		aDone=ETrue;
       
   133 		}
       
   134 	aName.SkipAndMark(n);
       
   135 	return(KErrNone);
       
   136 	}
       
   137 
       
   138 TInt TParseBase::ParseExt(TLex& aName,TBool& aDone)
       
   139 //
       
   140 // Parse the extension.
       
   141 //
       
   142 	{
       
   143 
       
   144 	TPtrC d=aName.RemainderFromMark();
       
   145 	if (d.Length() && !IsSpace(d) && !aDone)
       
   146 		{
       
   147 		if (d.Locate(KMatchOne)!=KErrNotFound) //	Found ? in the name
       
   148 			iWild|=(EWildExt|EWildEither|EWildIsKMatchOne);
       
   149 		if (d.Locate(KMatchAny)!=KErrNotFound) //	Found * in the name
       
   150 			iWild|=(EWildExt|EWildEither|EWildIsKMatchAny);
       
   151 		
       
   152 		if(iMod)
       
   153 			{
       
   154 			if (NameBuf().Length()+d.Length()>KMaxFileName)
       
   155 				return(KErrBadName);
       
   156 			NameBuf()+=d;
       
   157 			NameBuf().TrimRight();
       
   158 			}
       
   159 		else
       
   160 			aName.SkipAndMark(d.Length());
       
   161 		aDone=ETrue;
       
   162 		}
       
   163 	return(KErrNone);
       
   164 	}
       
   165 
       
   166 TInt TParseBase::Set(const TDesC* aName,const TDesC* aRelated,const TDesC* aDefault,TBool allowWild)
       
   167 //
       
   168 // Parse a name. Optionally allow wild cards.
       
   169 //
       
   170 	{
       
   171 
       
   172 	TInt (TParseBase::*parse[KLexComponents])(TLex& aName,TBool& aDone);
       
   173 	parse[0]=&TParseBase::ParseDrive;
       
   174 	parse[1]=&TParseBase::ParsePath;
       
   175 	parse[2]=&TParseBase::ParseName;
       
   176 	parse[3]=&TParseBase::ParseExt;
       
   177 	
       
   178 	iWild=0;
       
   179 
       
   180 	Mem::FillZ(&iField[0],sizeof(iField));
       
   181 	
       
   182 	TLex name(*aName);
       
   183 	TLex def;
       
   184 	TLex rel;
       
   185 	TInt lexnames;
       
   186 	if(iMod)
       
   187 		{
       
   188 		if (aRelated)
       
   189 			rel=(*aRelated);
       
   190 		if (aDefault)
       
   191 			def=(*aDefault);
       
   192 		NameBuf().Zero();
       
   193 		lexnames = KLexNames;
       
   194 		}
       
   195 	else
       
   196 		{
       
   197 		lexnames = 1;
       
   198 		}
       
   199 	
       
   200 	TLex* lex[KLexNames];
       
   201 	lex[0]=(&name);
       
   202 	lex[1]=(&rel);
       
   203 	lex[2]=(&def);
       
   204 	
       
   205 	name.Mark();
       
   206 	rel.Mark();
       
   207 	def.Mark();
       
   208 	
       
   209 	TInt r;
       
   210 	TInt pos=0;
       
   211 	
       
   212 	for (TInt i=0;i<KLexComponents;i++)
       
   213 		{
       
   214 		TBool done=EFalse;
       
   215 		for (TInt j=0;j<lexnames;j++)
       
   216 			{
       
   217 			if ((r=(this->*parse[i])(*lex[j],done))<KErrNone)
       
   218 				return(r);
       
   219 			if (j==0 && done)
       
   220 				iField[i].present=ETrue;
       
   221 			}
       
   222 		TInt len;
       
   223 		if(iMod)
       
   224 			len=NameBuf().Length()-pos;
       
   225 		else
       
   226 			len=name.MarkedOffset()-pos;
       
   227 		iField[i].len=(TUint8)len;
       
   228 		iField[i].pos=(TUint8)pos;
       
   229 		pos+=len;
       
   230 		}
       
   231 	if (!allowWild && iWild)
       
   232 		return(KErrBadName);
       
   233 	if (iField[EPath].len==1)
       
   234 		iWild|=EIsRoot;
       
   235 	return(KErrNone);
       
   236 	}
       
   237 
       
   238 
       
   239 
       
   240 
       
   241 EXPORT_C TInt TParseBase::PopDir()
       
   242 /**
       
   243 Removes the last directory from the path in the fully parsed specification.
       
   244  
       
   245 This function may be used to navigate up one level in a directory hierarchy.
       
   246 An error is returned if the specified directory is the root.
       
   247 
       
   248 @return KErrNone if successful, otherwise one of the other system-wide error 
       
   249         codes.
       
   250 */
       
   251 	{
       
   252 
       
   253 	if (IsRoot())
       
   254 		return(KErrGeneral);
       
   255 	TInt len;
       
   256 	if (iField[EName].pos==0 && NameBuf().Length()==256)
       
   257 		len=256;
       
   258 	else
       
   259 		len=iField[EName].pos;
       
   260 	TPtrC p(NameBuf().Ptr(),len-1);
       
   261 	TInt pos=p.LocateReverse(KPathDelimiter)+1;
       
   262 	len-=pos;
       
   263 	NameBuf().Delete(pos,len);
       
   264 	iField[EName].pos=(TUint8)(iField[EName].pos-len);
       
   265 	iField[EExt].pos=(TUint8)(iField[EExt].pos-len);
       
   266 	iField[EPath].len=(TUint8)(iField[EPath].len-len);
       
   267 	if (iField[EPath].len==1)
       
   268 		iWild|=EIsRoot;
       
   269 	return(KErrNone);
       
   270 	}
       
   271 
       
   272 
       
   273 
       
   274 
       
   275 EXPORT_C TInt TParseBase::AddDir(const TDesC& aName)
       
   276 /**
       
   277 Adds a single directory onto the end of the path in
       
   278 the fully parsed specification. 
       
   279 
       
   280 The directory is inserted between the final directory, and the filename, if 
       
   281 there is one.
       
   282 
       
   283 @param aName The directory to be added. It must not start with a \\ otherwise 
       
   284              the function does not recognise it as a valid directory name
       
   285              and an error is returned.
       
   286              The directory name must not end with a \\ since the function 
       
   287              adds this automatically. It must not exceed the maximum
       
   288              filename length, KMaxFileName characters, otherwise  an error
       
   289              is returned.
       
   290 
       
   291 @return KErrNone if successful, otherwise another of the system-wide error 
       
   292         codes.   
       
   293 @see KMaxFileName
       
   294 */
       
   295 	{
       
   296 
       
   297 	if (aName.Length()==0)
       
   298 		return(KErrNone);
       
   299 	TInt len=aName.Length()+1;
       
   300 	if ((len+NameBuf().Length())>NameBuf().MaxLength())
       
   301 		return(KErrGeneral);
       
   302 	TInt pos=aName.Locate(KPathDelimiter);
       
   303 	if (pos!=KErrNotFound)
       
   304 		return(KErrBadName);
       
   305 	TFileName n=aName;
       
   306 	n.Append(KPathDelimiter);
       
   307 	NameBuf().Insert(iField[EName].pos,n);
       
   308 	iField[EPath].len=(TUint8)(iField[EPath].len+len);
       
   309 	iField[EName].pos=(TUint8)(iField[EName].pos+len);
       
   310 	iField[EExt].pos=(TUint8)(len+iField[EExt].pos);
       
   311 	if (IsRoot())
       
   312 		iWild&=~EIsRoot;
       
   313 	return(KErrNone);
       
   314 	}
       
   315 
       
   316 
       
   317 
       
   318 
       
   319 EXPORT_C const TDesC& TParseBase::FullName() const
       
   320 /**
       
   321 Gets the complete file specification.
       
   322 
       
   323 This is in the form:
       
   324 
       
   325 drive-letter: \\path\\filename.extension
       
   326 
       
   327 @return The fully parsed file specification.
       
   328 */
       
   329 	{
       
   330 
       
   331 	return(NameBufC());
       
   332 	}
       
   333 
       
   334 
       
   335 
       
   336 
       
   337 EXPORT_C TPtrC TParseBase::Drive() const
       
   338 /**
       
   339 Gets the drive letter.
       
   340 
       
   341 The drive letter is in the form:
       
   342 
       
   343 drive-letter:
       
   344 
       
   345 Note that the drive letter is folded.
       
   346 
       
   347 @return The drive letter and colon.
       
   348 */
       
   349 	{
       
   350 
       
   351 	const SField& f=iField[EDrive];
       
   352 	return(NameBufC().Mid(f.pos,f.len));
       
   353 	}
       
   354 
       
   355 
       
   356 
       
   357 
       
   358 EXPORT_C TPtrC TParseBase::Path() const
       
   359 /**
       
   360 Gets the path.
       
   361 
       
   362 The path is in the form:
       
   363 
       
   364 \\path\\
       
   365 
       
   366 @return The path. It always begins and ends in a backslash.
       
   367 */
       
   368 	{
       
   369 
       
   370 	const SField& f=iField[EPath];
       
   371 	return(NameBufC().Mid(f.pos,f.len));
       
   372 	}
       
   373 
       
   374 
       
   375 
       
   376 
       
   377 EXPORT_C TPtrC TParseBase::DriveAndPath() const
       
   378 /**
       
   379 Gets the drive letter and path.
       
   380 
       
   381 This is in the form
       
   382 
       
   383 drive-letter:\\path\\
       
   384 
       
   385 Note that the drive letter is folded
       
   386 
       
   387 @return The drive and path.
       
   388 */
       
   389 	{
       
   390 
       
   391 	const SField& f=iField[EDrive];
       
   392 	return(NameBufC().Mid(f.pos,f.len+iField[EPath].len));
       
   393 	}
       
   394 
       
   395 
       
   396 
       
   397 
       
   398 EXPORT_C TPtrC TParseBase::Name() const
       
   399 /**
       
   400 Gets the filename.
       
   401 
       
   402 This is in the form
       
   403 
       
   404 filename
       
   405 
       
   406 @return The filename.
       
   407 */
       
   408 	{
       
   409 
       
   410 	const SField& f=iField[EName];
       
   411 	return(NameBufC().Mid(f.pos,f.len));
       
   412 	}
       
   413 
       
   414 
       
   415 
       
   416 
       
   417 EXPORT_C TPtrC TParseBase::Ext() const
       
   418 /**
       
   419 Gets the extension.
       
   420 
       
   421 This is in the form:
       
   422 
       
   423 .extension
       
   424 
       
   425 @return The extension and preceding dot.
       
   426 */
       
   427 	{
       
   428 
       
   429 	const SField& f=iField[EExt];
       
   430 	return(NameBufC().Mid(f.pos,f.len));
       
   431 	}
       
   432 
       
   433 
       
   434 
       
   435 
       
   436 EXPORT_C TPtrC TParseBase::NameAndExt() const
       
   437 /**
       
   438 Gets the filename and extension.
       
   439 
       
   440 This is in the form:
       
   441 
       
   442 filename.ext
       
   443 
       
   444 @return The filename and extension.
       
   445 */
       
   446 	{
       
   447 
       
   448 	const SField& f=iField[EName];
       
   449 	return(NameBufC().Mid(f.pos,f.len+iField[EExt].len));
       
   450 	}
       
   451 
       
   452 
       
   453 
       
   454 
       
   455 EXPORT_C TBool TParseBase::DrivePresent() const
       
   456 /**
       
   457 Tests whether a drive is present.
       
   458 
       
   459 Note that this function refers to a component 
       
   460 in the aName argument specified in calls to TParse::Set(), TParse::SetNoWild() 
       
   461 or RFs::Parse(), not to the resulting fully parsed file specification.
       
   462 
       
   463 @return True if a drive present, false if not.
       
   464 
       
   465 @see TParse
       
   466 @see RFs
       
   467 */
       
   468 	{
       
   469 
       
   470 	return(iField[EDrive].present);
       
   471 	}
       
   472 
       
   473 
       
   474 
       
   475 
       
   476 EXPORT_C TBool TParseBase::PathPresent() const
       
   477 /**
       
   478 Tests whether a path is present.
       
   479 
       
   480 Note that this function refers to a component 
       
   481 in the aName argument specified in calls to TParse::Set(), TParse::SetNoWild() 
       
   482 or RFs::Parse(), not to the resulting fully parsed file specification.
       
   483 
       
   484 @return True if a path present, false if not.
       
   485 
       
   486 @see TParse
       
   487 @see RFs
       
   488 */
       
   489 	{
       
   490 
       
   491 	return(iField[EPath].present);
       
   492 	}
       
   493 
       
   494 
       
   495 
       
   496 
       
   497 EXPORT_C TBool TParseBase::NamePresent() const
       
   498 /**
       
   499 Tests whether a file name is present.
       
   500 
       
   501 Note that this function refers to a component 
       
   502 in the aName argument specified in calls to TParse::Set(), TParse::SetNoWild() 
       
   503 or RFs::Parse(), not to the resulting fully parsed file specification.
       
   504 
       
   505 This function returns true even if the filename specified in aName contains 
       
   506 only wildcards. It only returns false if nothing is specified.
       
   507 
       
   508 @return True if a name present, false if not.
       
   509 */
       
   510 	{
       
   511 
       
   512 	return(iField[EName].present);
       
   513 	}
       
   514 
       
   515 
       
   516 
       
   517 
       
   518 EXPORT_C TBool TParseBase::ExtPresent() const
       
   519 /**
       
   520 Tests whether an extension is present.
       
   521 
       
   522 Note that this function refers to a component
       
   523 in the aName argument specified in calls to TParse::Set(), TParse::SetNoWild() 
       
   524 or RFs::Parse(), not to the resulting fully parsed file specification.
       
   525 
       
   526 This function returns true even if the extension contains only wildcards. 
       
   527 It only returns false if nothing is specified.
       
   528 
       
   529 @return True if an extension present, false if not.
       
   530 */
       
   531 	{
       
   532 
       
   533 	return(iField[EExt].present);
       
   534 	}
       
   535 
       
   536 
       
   537 
       
   538 
       
   539 EXPORT_C TBool TParseBase::NameOrExtPresent() const
       
   540 /**
       
   541 Tests whether a filename or an extension are present.
       
   542 
       
   543 Note that this function refers to a component in the aName argument
       
   544 specified in calls to TParse::Set(), TParse::SetNoWild() or RFs::Parse(), not
       
   545 to the resulting fully parsed file specification.
       
   546 
       
   547 This function returns true even if the filename or extension specified in 
       
   548 aName contain only wildcards. It only returns false if nothing is specified.
       
   549 
       
   550 @return True if either a name or an extension or both are present,
       
   551         otherwise false.
       
   552 */
       
   553 	{
       
   554 
       
   555 	return(iField[EName].present || iField[EExt].present);
       
   556 	}
       
   557 
       
   558 
       
   559 
       
   560 
       
   561 
       
   562 EXPORT_C TBool TParseBase::IsRoot() const
       
   563 /**
       
   564 Tests whether the path in the fully parsed specification is the root directory.
       
   565 
       
   566 @return True if path is root, false if not.
       
   567 */
       
   568 	{
       
   569 
       
   570 	return(iWild&EIsRoot);
       
   571 	}
       
   572 
       
   573 
       
   574 
       
   575 
       
   576 EXPORT_C TBool TParseBase::IsWild() const
       
   577 /**
       
   578 Tests whether the filename or the extension in the fully parsed specification 
       
   579 contains one or more wildcard characters.
       
   580 
       
   581 @return True if wildcards are present, false if not.
       
   582 */
       
   583 	{
       
   584 
       
   585 	return(iWild&EWildEither);	
       
   586 	}
       
   587 
       
   588 
       
   589 
       
   590 
       
   591 EXPORT_C TBool TParseBase::IsKMatchOne() const
       
   592 /**
       
   593 Tests whether the name or the extension contains a question mark wildcard.
       
   594 
       
   595 @return True if either the name or extension has a ? wild card,
       
   596         false otherwise.
       
   597 */
       
   598 	{
       
   599 
       
   600 	return(iWild&EWildIsKMatchOne);	
       
   601 	}
       
   602 
       
   603 
       
   604 
       
   605 
       
   606 EXPORT_C TBool TParseBase::IsKMatchAny() const
       
   607 /**
       
   608 Tests whether the name or the extension contains asterisk wildcards.
       
   609 
       
   610 @return True if either the name or extension has a * wild card,
       
   611         false otherwise.
       
   612 */
       
   613 	{
       
   614 
       
   615 	return(iWild&EWildIsKMatchAny);	
       
   616 	}
       
   617 
       
   618 
       
   619 
       
   620 
       
   621 EXPORT_C TBool TParseBase::IsNameWild() const
       
   622 /**
       
   623 Tests whether the filename in the fully parsed specification contains one or 
       
   624 more wildcard characters.
       
   625 
       
   626 @return True if the filename contains wildcard characters, false if not.
       
   627 */
       
   628 	{
       
   629 
       
   630 	return(iWild&EWildName);
       
   631 	}
       
   632 
       
   633 
       
   634 
       
   635 
       
   636 EXPORT_C TBool TParseBase::IsExtWild() const
       
   637 /**
       
   638 Tests whether the extension in the fully parsed specification contains one 
       
   639 or more wildcard characters.
       
   640 
       
   641 @return True if the extension contains wildcard characters, false if not.
       
   642 */
       
   643 	{
       
   644 
       
   645 	return(iWild&EWildExt);
       
   646 	}
       
   647 
       
   648 
       
   649 
       
   650 
       
   651 EXPORT_C TParse::TParse()
       
   652 /**
       
   653 Default constructor.
       
   654 */
       
   655 	{
       
   656 	iMod=1;
       
   657 	}
       
   658 
       
   659 
       
   660 
       
   661 
       
   662 EXPORT_C TInt TParse::Set(const TDesC& aName,const TDesC* aRelated,const TDesC* aDefault)
       
   663 /**
       
   664 Parses a file specification, allowing wildcards in the filename and extension.
       
   665 
       
   666 This function sets up the TParse object so that it can be used to provide 
       
   667 useful information.
       
   668 
       
   669 @param aName    The file specification to be parsed.
       
   670 @param aRelated The related file specification. This is optional,
       
   671                 set to NULL to  omit.
       
   672 @param aDefault The default file specification. This is optional,
       
   673                 set to NULL to omit.
       
   674                 
       
   675 @return KErrNone, if successful, otherwise one of the other system-wide error
       
   676         codes.
       
   677 */
       
   678 	{
       
   679 
       
   680 	return(TParseBase::Set(&aName,aRelated,aDefault,ETrue));
       
   681 	}
       
   682 
       
   683 
       
   684 
       
   685 
       
   686 EXPORT_C TInt TParse::SetNoWild(const TDesC& aName,const TDesC* aRelated,const TDesC* aDefault)
       
   687 /**
       
   688 Parses a file specification; disallows wildcards in any part of the file name 
       
   689 or extension.
       
   690 
       
   691 If you need to specify wildcards use Set(). Otherwise, this 
       
   692 function behaves in the same way as Set().
       
   693 
       
   694 @param aName    The file specification to be parsed.
       
   695 @param aRelated The related file specification. This is optional,
       
   696                 set to NULL to omit.
       
   697 @param aDefault The default file specification. This is optional,
       
   698                 set to NULL to omit.
       
   699                 
       
   700 @return KErrNone, if successful, otherwise one of the other system-wide error 
       
   701         codes.
       
   702 
       
   703 @see TParse::Set
       
   704 */
       
   705 	{
       
   706 
       
   707 	return(TParseBase::Set(&aName,aRelated,aDefault,EFalse));
       
   708 	}
       
   709 
       
   710 
       
   711 
       
   712 
       
   713 EXPORT_C TDes& TParse::NameBuf()
       
   714 /**
       
   715 Gets a reference to the descriptor containing the file specification passed to
       
   716 the constructor of this object. 
       
   717 
       
   718 @return A reference to the descriptor containing the filename.
       
   719 */
       
   720 	{
       
   721 
       
   722 	return(iNameBuf);
       
   723 	}
       
   724 
       
   725 
       
   726 
       
   727 
       
   728 EXPORT_C const TDesC& TParse::NameBufC() const
       
   729 /**
       
   730 Gets a const reference to the descriptor containing the file specification
       
   731 passed to the constructor of this object. 
       
   732 
       
   733 @return A const reference to the descriptor containing the file specification.
       
   734 */
       
   735 	{
       
   736 
       
   737 	return(iNameBuf);
       
   738 	}
       
   739 
       
   740 
       
   741 
       
   742 
       
   743 EXPORT_C TParsePtr::TParsePtr(TDes& aName)
       
   744 	: iNameBuf((TText*)aName.Ptr(),aName.Length(),aName.MaxLength())
       
   745 /**
       
   746 Constructor taking a reference to a filename.
       
   747 
       
   748 The specified filename is parsed and if this fails, a panic is raised.
       
   749 
       
   750 @param aName Reference to the filename to be parsed. On return contains
       
   751              the fully parsed path specification. If a filename and extension
       
   752              are specified, they may both contain wildcards.
       
   753              The maximum length is KMaxFileName characters.
       
   754              
       
   755 @panic FSCLIENT 24 if the the specified name fails to parse.
       
   756              
       
   757 @see KMaxFileName
       
   758 */
       
   759 	{
       
   760 	iMod=1;
       
   761 	TInt r=TParseBase::Set(&aName,NULL,NULL,ETrue);
       
   762 	__ASSERT_ALWAYS(r==KErrNone,Panic(EParsePtrBadDescriptor0));
       
   763 	}
       
   764 
       
   765 
       
   766 
       
   767 
       
   768 EXPORT_C TDes& TParsePtr::NameBuf()
       
   769 /**
       
   770 Gets a reference to the descriptor containing the filename passed to
       
   771 the constructor of this object. 
       
   772 
       
   773 @return A reference to the descriptor containing the filename.
       
   774 */
       
   775 	{
       
   776 
       
   777 	return(iNameBuf);
       
   778 	}
       
   779 
       
   780 
       
   781 
       
   782 
       
   783 EXPORT_C const TDesC& TParsePtr::NameBufC() const
       
   784 /**
       
   785 Gets a const reference to the descriptor containing the filename passed to
       
   786 the constructor of this object. 
       
   787 
       
   788 @return A const reference to the descriptor containing the filename.
       
   789 */
       
   790 	{
       
   791 
       
   792 	return(iNameBuf);
       
   793 	}
       
   794 
       
   795 
       
   796 
       
   797 
       
   798 EXPORT_C TParsePtrC::TParsePtrC(const TDesC& aName)
       
   799 /**
       
   800 Constructor taking a constant reference to a filename.
       
   801 
       
   802 The filename is parsed and if this fails, a panic is raised.
       
   803 Note that the filename cannot be modified using this class.
       
   804 
       
   805 @param aName Constant reference to the filename to be parsed.
       
   806              On return contains the fully parsed filename.
       
   807              If a file and extension are specified, they may both
       
   808              contain wildcards.
       
   809              The maximum length is KMaxFileName characters.
       
   810              
       
   811 @panic FSCLIENT 24 if the the specified name fails to parse.
       
   812 
       
   813 @see KMaxFileName
       
   814 */
       
   815 	{
       
   816 	iMod=0;
       
   817 	iNameBuf.Set(aName);
       
   818 	TInt r = TParseBase::Set(&aName,NULL,NULL,ETrue);
       
   819 	__ASSERT_ALWAYS(r==KErrNone,Panic(EParsePtrBadDescriptor0));
       
   820 	}
       
   821 
       
   822 
       
   823 
       
   824 
       
   825 EXPORT_C TDes& TParsePtrC::NameBuf()
       
   826 /**
       
   827 Gets a reference to the descriptor containing the filename passed to
       
   828 the constructor of this object. 
       
   829 
       
   830 @return A reference to the descriptor containing the filename.
       
   831 */
       
   832 	{
       
   833 
       
   834 	Panic(EParsePtrCAccessError);
       
   835 	return(*(TDes*)&iNameBuf);
       
   836 	}
       
   837 
       
   838 
       
   839 
       
   840 
       
   841 EXPORT_C const TDesC& TParsePtrC::NameBufC() const
       
   842 /**
       
   843 Gets a const reference to the descriptor containing the filename passed to
       
   844 the constructor of this object. 
       
   845 
       
   846 @return A const reference to the descriptor containing the filename.
       
   847 */
       
   848 	{
       
   849 
       
   850 	return(iNameBuf);
       
   851 	}
       
   852