os/kernelhwsrv/kernel/eka/euser/us_exec.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     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 // e32\euser\us_exec.cpp
    15 // 
    16 //
    17 
    18 #include "us_std.h"
    19 #include "us_data.h"
    20 #include <e32des8_private.h>
    21 #include <e32kpan.h>
    22 #include <unicode.h>
    23 #include <videodriver.h>
    24 #include "CompareImp.h"
    25 #include <e32atomics.h>
    26 
    27 #include "locmapping.h"
    28 
    29 #ifdef __VC32__
    30   #pragma setlocale("english")
    31 #endif
    32 
    33 _LIT(KLitSpace, " ");
    34 _LIT(KLitOpeningBracket, "(");
    35 _LIT(KLitMinusSign, "-");
    36 _LIT(KLitZeroPad, "0");
    37 
    38 #ifdef SYMBIAN_DISTINCT_LOCALE_MODEL
    39 _LIT(KFindLan, "elocl_lan.");
    40 _LIT(KFindReg, "elocl_reg.");
    41 _LIT(KFindCol, "elocl_col.");
    42 _LIT(KLoc, "elocl.");
    43 #endif
    44 
    45 // Private use area ranges of printable/non-printable characters.
    46 // This is a sorted list of numbers indicating the ranges in which characters
    47 // are printable and non-printable. The elements 0, 2, 4... are the first
    48 // characters of printable ranges and The elements 1, 3, 5... are the first
    49 // characters of non-printable ranges
    50 // We will assume that anything in the End User Sub-area is printable.
    51 static const TInt PUAPrintableRanges[] =
    52 	{
    53 	0xE000, 0xF6D9,		// End user area + unassigned corporate use area
    54 	0xF6DB, 0xF6DC,		// Replacement for character not in font
    55 	0xF6DE, 0xF700,		// various EIKON and Agenda symbols
    56 	0x10000, KMaxTInt	// everything else printable
    57 	};
    58 
    59 static TBool IsPUAPrintable(TInt aChar)
    60 	{
    61 	if (0x110000 <= aChar)
    62 		return 0;	// non-characters not printable
    63 	TInt i = 0;
    64 	while (PUAPrintableRanges[i] <= aChar)
    65 		++i;
    66 	return i & 1;
    67 	}
    68 
    69 
    70 
    71 
    72 EXPORT_C TBool User::JustInTime()
    73 /**
    74 Tests whether just-in-time debugging is on or off.
    75 
    76 The function is used by the Kernel, on the Emulator, to decide whether to do
    77 just-in-time debugging for panics. The function applies to the current process.
    78 
    79 Unless overridden by calling User::SetJustInTime(EFalse), just-in-time debugging 
    80 is on by default.
    81 
    82 @return True, if just-in-time debugging is on. False otherwise.
    83 @see RProcess::JustInTime
    84 */
    85 	{
    86 
    87 	return RProcess().JustInTime();
    88 	}
    89 
    90 
    91 
    92 
    93 EXPORT_C void User::SetJustInTime(const TBool aBoolean)
    94 /**
    95 Sets just-in-time debugging for this process on or off.
    96 
    97 While the function can be called by code running on both the Emulator and ARM,
    98 it only has an effect on the Emulator. Turning just-in-time debugging off
    99 prevents the debug Emulator closing down when a panic occurs.
   100 
   101 By default, just-in-time debugging is on.
   102 
   103 Note that the emulator handles panics in the nomal manner, i.e. by killing 
   104 the thread.
   105 
   106 @param aBoolean ETrue, if just-in-time debugging is to be set on. EFalse, 
   107                 if just-in-time debugging is to be set off.
   108                 EFalse causes _asm 3 calls to be disabled.
   109 @see RProcess::SetJustInTime
   110 */
   111 	{
   112 
   113 	RProcess().SetJustInTime(aBoolean);
   114 	}
   115 
   116 
   117 extern const LCharSet* GetLocaleDefaultCharSet();
   118 extern const LCharSet* GetLocalePreferredCharSet();
   119 
   120 // Convert to folded.
   121 EXPORT_C TUint User::Fold(TUint aChar)
   122 /**
   123 @deprecated
   124 
   125 Folds the specified character.
   126 
   127 Folding converts the character to a form which can be used in tolerant
   128 comparisons without control over the operations performed. Tolerant comparisons
   129 are those which ignore character differences like case and accents.
   130 
   131 The result of folding a character depends on the locale and on whether this 
   132 is a UNICODE build or not.
   133 
   134 Note that for a non-UNICODE build, if the binary value of the character aChar
   135 is greater than or equal to 0x100, then the character returned is the same as
   136 the character passed to the function.
   137 
   138 @param aChar The character to be folded.
   139 
   140 @return The folded character.
   141 
   142 @see TChar::Fold()
   143 */
   144 	{
   145 	// ASCII chars excluding 'i's can be handled by naive folding
   146 	if (aChar < 0x80 && aChar != 'I')
   147 		return (aChar >= 'A' && aChar <= 'Z') ? (aChar | 0x0020) : aChar;
   148 	else
   149 		return TUnicode(aChar).Fold(TChar::EFoldStandard,GetLocaleCharSet()->iCharDataSet);
   150 	}
   151 
   152 
   153 
   154 
   155 // Convert to a folded version, specifying the folding methods.
   156 EXPORT_C TUint User::Fold(TUint aChar,TInt aFlags)
   157 /**
   158 Folds the character according to a specified folding method.
   159 
   160 @param aChar  The character to be folded.
   161 @param aFlags A set of flags defining the folding method. They are:
   162 
   163               TChar::EFoldCase, convert characters to their lower case form,
   164               if any;
   165               
   166               TChar::EFoldAccents, strip accents;
   167               
   168               TChar::EFoldDigits, convert digits representing values 0..9 to
   169               characters '0'..'9';
   170               
   171               TChar::EFoldSpaces, convert all spaces (ordinary, fixed-width,
   172               ideographic, etc.) to ' ';
   173               
   174               TChar::EFoldKana, convert hiragana to katakana;
   175               
   176               TChar::EFoldWidth, fold full width and half width variants to
   177               their standard forms;
   178               
   179               TChar::EFoldAll, use all of the above folding methods.
   180               
   181 @return The folded character.
   182 @see TChar::Fold()
   183 */
   184 	{
   185 	return TUnicode(aChar).Fold(aFlags,GetLocaleCharSet()->iCharDataSet);
   186 	}
   187 
   188 
   189 
   190 
   191 // Convert to collated.
   192 EXPORT_C TUint User::Collate(TUint aChar)
   193 /**
   194 Converts the character to its collated form.
   195 
   196 Collating is the process of removing differences between characters that are 
   197 deemed unimportant for the purposes of ordering characters. The result of 
   198 the conversion depends on the locale and on whether this is a UNICODE build 
   199 or not.
   200 
   201 Note that for a non UNICODE build, if the binary value of the character aChar
   202 is greater than or equal to 0x100, then the character returned is the same as
   203 the character passed to the function.
   204 
   205 @param aChar The character to be folded.
   206 
   207 @return The converted character.
   208 */
   209 	{
   210 	return TUnicode(aChar).Fold(TChar::EFoldStandard,GetLocaleCharSet()->iCharDataSet);
   211 	}
   212 
   213 
   214 
   215 
   216 // Convert to lower case.
   217 EXPORT_C TUint User::LowerCase(TUint aChar)
   218 /**
   219 Converts the specified character to lower case.
   220 
   221 The result of the conversion depends on the locale and on whether this is
   222 a UNICODE build or not.
   223 
   224 Note that for a non-UNICODE build, if the binary value of the character
   225 aChar is greater than or equal to 0x100, then the character returned is
   226 the same as the character passed to the function.
   227 
   228 @param aChar The character to be converted to lower case.
   229 
   230 @return The lower case character.
   231 */
   232 	{
   233 	// ASCII chars excluding 'i's can be handled by naive folding
   234 	if (aChar < 0x80 && aChar != 'I')
   235 		return (aChar >= 'A' && aChar <= 'Z') ? (aChar | 0x0020) : aChar;
   236 	else
   237 		return TUnicode(aChar).GetLowerCase(GetLocaleCharSet()->iCharDataSet);
   238 	}
   239 
   240 
   241 
   242 
   243 // Convert to upper case.
   244 EXPORT_C TUint User::UpperCase(TUint aChar)
   245 /**
   246 Converts a specified character to upper case.
   247 
   248 The result of the conversion depends on the locale and on whether this is
   249 a UNICODE build or not.
   250 
   251 Note that for a non UNICODE build, if the binary value of the character aChar
   252 is greater than or equal to 0x100, then the character returned is the same as
   253 the character passed to the function.
   254 
   255 @param aChar The character to be converted to upper case.
   256 
   257 @return The upper case character.
   258 */
   259 	{
   260 	// ASCII chars excluding 'i's can be handled by naive folding
   261 	if (aChar < 0x80 && aChar != 'i')
   262 		return (aChar >= 'a' && aChar <= 'z') ? (aChar & ~0x0020) : aChar;
   263 	else
   264 		return TUnicode(aChar).GetUpperCase(GetLocaleCharSet()->iCharDataSet);
   265 	}
   266 
   267 
   268 
   269 
   270 // Return the title case version of a character, which is the case of composite characters like Dz.
   271 EXPORT_C TUint User::TitleCase(TUint aChar)
   272 /**
   273 Converts a specified character to its title case version.
   274 
   275 @param aChar The character to be converted.
   276 
   277 @return The converted character.
   278 */
   279 	{
   280 	return TUnicode(aChar).GetTitleCase(GetLocaleCharSet()->iCharDataSet);
   281 	}
   282 
   283 
   284 
   285 
   286 EXPORT_C TUint TChar::GetUpperCase() const
   287 /**
   288 Gets the character value after conversion to uppercase or the character's 
   289 own value, if no uppercase form exists.
   290 
   291 The character object itself is not changed.
   292 
   293 @return The character value after conversion to uppercase.
   294 */
   295 	{
   296 	return User::UpperCase(iChar);
   297 	}
   298 
   299 
   300 
   301 
   302 EXPORT_C TUint TChar::GetLowerCase() const
   303 /**
   304 Gets the character value after conversion to lowercase or the character's 
   305 own value, if no lowercase form exists.
   306 
   307 The character object itself is not changed.
   308 
   309 @return The character value after conversion to lowercase.
   310 */
   311 	{
   312 	return User::LowerCase(iChar);
   313 	}
   314 
   315 
   316 
   317 
   318 EXPORT_C TUint TChar::GetTitleCase() const
   319 /**
   320 Gets the character value after conversion to titlecase or the character's 
   321 own value, if no titlecase form exists.
   322 
   323 The titlecase form of a character is identical to its uppercase form unless 
   324 a specific titlecase form exists.
   325 
   326 @return The value of the character value after conversion to titlecase form.
   327 */
   328 	{
   329 	return User::TitleCase(iChar);
   330 	}
   331 
   332 
   333 
   334 
   335 EXPORT_C TBool TChar::IsLower() const
   336 /**
   337 Tests whether the character is lowercase.
   338 
   339 @return True, if the character is lowercase; false, otherwise.
   340 */
   341 	{
   342 	return GetCategory() == TChar::ELlCategory;
   343 	}
   344 
   345 
   346 
   347 
   348 EXPORT_C TBool TChar::IsUpper() const
   349 /**
   350 Tests whether the character is uppercase.
   351 
   352 @return True, if the character is uppercase; false, otherwise.
   353 */
   354 	{
   355 	return GetCategory() == TChar::ELuCategory;
   356 	}
   357 
   358 
   359 
   360 // Return TRUE if the character is title case, which is the case of composite characters like Dz.
   361 EXPORT_C TBool TChar::IsTitle() const
   362 /**
   363 Tests whether this character is in titlecase.
   364 
   365 @return True, if this character is in titlecase; false, otherwise.
   366 */
   367 	{
   368 	return GetCategory() == TChar::ELtCategory;
   369 	}
   370 
   371 
   372 
   373 
   374 EXPORT_C TBool TChar::IsAlpha() const
   375 /**
   376 Tests whether the character is alphabetic.
   377 
   378 For Unicode, the function returns TRUE for all letters, including those from 
   379 syllabaries and ideographic scripts. The function returns FALSE for letter-like 
   380 characters that are in fact diacritics. Specifically, the function returns 
   381 TRUE for categories: ELuCategory, ELtCategory, ELlCategory, and ELoCategory; 
   382 it returns FALSE for all other categories including ELmCategory.
   383 
   384 @return True, if the character is alphabetic; false, otherwise.
   385 
   386 @see TChar::IsAlphaDigit()
   387 @see TChar::TCategory
   388 */
   389 	{
   390 	return GetCategory() <= TChar::EMaxLetterOrLetterModifierCategory;
   391 	}
   392 
   393 
   394 
   395 
   396 EXPORT_C TBool TChar::IsDigit() const
   397 /**
   398 Tests whether the character is a standard decimal digit.
   399 
   400 For Unicode, this function returns TRUE only
   401 for the digits '0'...'9' (U+0030...U+0039), 
   402 not for other digits in scripts like Arabic, Tamil, etc.
   403 
   404 @return True, if the character is a standard decimal digit; false, otherwise.
   405 
   406 @see TChar::GetCategory()
   407 @see TChar::GetNumericValue
   408 */
   409 	{
   410 	return iChar >= '0' && iChar <= '9'; // standard decimal digits only
   411 	}
   412 
   413 
   414 
   415 
   416 EXPORT_C TBool TChar::IsAlphaDigit() const
   417 /**
   418 Tests whether the character is alphabetic or a decimal digit.
   419 
   420 It is identical to (IsAlpha()||IsDigit()).
   421 
   422 @return True, if the character is alphabetic or a decimal digit; false, otherwise.
   423 
   424 @see TChar::IsAlpha()
   425 @see TChar::IsDigit()
   426 */
   427 	{
   428 	TInt cat = (TInt)GetCategory();
   429 	return cat <= TChar::EMaxLetterOrLetterModifierCategory ||
   430 		   (iChar < 256 && cat == TChar::ENdCategory);	// accept any letter, but accept only standard digits
   431 	}
   432 
   433 
   434 
   435 
   436 EXPORT_C TBool TChar::IsHexDigit() const
   437 /** 
   438 Tests whether the character is a hexadecimal digit (0-9, a-f, A-F).
   439 
   440 @return True, if the character is a hexadecimal digit; false, otherwise.
   441 */
   442 	{
   443 	/*
   444 	The following code will actually run faster than the non-Unicode version, which needs
   445 	to call the Exec function.
   446 	*/
   447 	return iChar <= 'f' && iChar >= '0' &&
   448 		   (iChar <= '9' || iChar >= 'a' || (iChar >= 'A' && iChar <= 'F'));	// only standard hex digits will do
   449 	}
   450 
   451 
   452 
   453 
   454 EXPORT_C TBool TChar::IsSpace() const
   455 /**
   456 Tests whether the character is a white space character.
   457 
   458 White space includes spaces, tabs and separators.
   459 
   460 For Unicode, the function returns TRUE for all characters in the categories: 
   461 EZsCategory, EZlCategory and EZpCategory, and also for the characters 0x0009 
   462 (horizontal tab), 0x000A (linefeed), 0x000B (vertical tab), 0x000C (form feed), 
   463 and 0x000D (carriage return).
   464 
   465 @return True, if the character is white space; false, otherwise.
   466 
   467 @see TChar::TCategory
   468 */
   469 	{
   470 	/*
   471 	The Unicode characters 0009 .. 000D (tab, linefeed, vertical tab, formfeed, carriage return)
   472 	have the category Cc (control); however, we want to avoid breaking traditional programs
   473 	by getting IsSpace() to return TRUE for them.
   474 	*/
   475 	return (iChar <= 0x000D && iChar >= 0x0009) ||
   476 		   (GetCategory() & 0xF0) == TChar::ESeparatorGroup;
   477 	}
   478 
   479 
   480 
   481 
   482 EXPORT_C TBool TChar::IsPunctuation() const
   483 /**
   484 Tests whether the character is a punctuation character.
   485 
   486 For Unicode, punctuation characters are any character in the categories:
   487 EPcCategory, EPdCategory, EPsCategory, EPeCategory, EPiCategory,
   488 EPfCategory, EPoCategory.
   489 
   490 @return True, if the character is punctuation; false, otherwise.
   491 
   492 @see TChar::TCategory
   493 */
   494 	{
   495 	return (GetCategory() & 0xF0) == TChar::EPunctuationGroup;
   496 	}
   497 
   498 
   499 
   500 
   501 EXPORT_C TBool TChar::IsGraph() const
   502 /**
   503 Tests whether the character is a graphic character.
   504 
   505 For Unicode, graphic characters include printable characters but not the space 
   506 character. Specifically, graphic characters are any character except those 
   507 in categories: EZsCategory,EZlCategory,EZpCategory, ECcCategory,ECfCategory,
   508 ECsCategory, ECoCategory, and ,ECnCategory.
   509 
   510 Note that for ISO Latin-1, all alphanumeric and punctuation characters are 
   511 graphic.
   512 
   513 @return True, if the character is a graphic character; false, otherwise.
   514 
   515 @see TChar::TCategory
   516 */
   517 	{
   518 	TUint type = TUnicode(iChar).GetCategory(0);
   519 	return type <= TChar::EMaxGraphicCategory ||
   520 		(type == TChar::ECoCategory && IsPUAPrintable(iChar));
   521 	}
   522 
   523 
   524 
   525 
   526 EXPORT_C TBool TChar::IsPrint() const
   527 /**
   528 Tests whether the character is a printable character.
   529 
   530 For Unicode, printable characters are any character except those in categories: 
   531 ECcCategory, ECfCategory, ECsCategory, ECoCategory and ECnCategory.
   532 
   533 Note that for ISO Latin-1, all alphanumeric and punctuation characters, plus 
   534 space, are printable.
   535 
   536 @return True, if the character is printable; false, otherwise.
   537 
   538 @see TChar::TCategory
   539 */
   540 	{
   541 	TUint type = TUnicode(iChar).GetCategory(0);
   542 	return type <= TChar::EMaxPrintableCategory ||
   543 		(type == TChar::ECoCategory && IsPUAPrintable(iChar));
   544 	}
   545 
   546 
   547 
   548 
   549 EXPORT_C TBool TChar::IsControl() const
   550 /**
   551 Tests whether the character is a control character.
   552 
   553 For Unicode, the function returns TRUE for all characters in the categories: 
   554 ECcCategory, ECfCategory, ECsCategory, ECoCategory and ECnCategoryCc.
   555 
   556 @return True, if the character is a control character; false, otherwise.
   557 
   558 @see TChar::TCategory
   559 */
   560 	{
   561 	return GetCategory() == TChar::ECcCategory;
   562 	}
   563 
   564 
   565 
   566 
   567 EXPORT_C TBool TChar::IsAssigned() const
   568 /**
   569 Tests whether this character has an assigned meaning in the Unicode encoding.
   570 
   571 All characters outside the range 0x0000 - 0xFFFF are unassigned and there 
   572 are also many unassigned characters within the Unicode range.
   573 
   574 Locales can change the assigned/unassigned status of characters. This means 
   575 that the precise behaviour of this function is locale-dependent.
   576 
   577 @return True, if this character has an assigned meaning; false, otherwise.
   578 */
   579 	{
   580 	return GetCategory() <= TChar::EMaxAssignedCategory;
   581 	}
   582 
   583 
   584 
   585 
   586 EXPORT_C void TChar::GetInfo(TCharInfo& aInfo) const
   587 /** 
   588 Gets this character;s standard category information. 
   589 
   590 This includes everything except its CJK width and decomposition, if any.
   591 
   592 @param aInfo On return, contains the character's standard category information.
   593 */
   594 	{
   595 	TUnicode(iChar).GetInfo(aInfo,GetLocaleCharSet()->iCharDataSet);
   596 	}
   597 
   598 
   599 
   600 
   601 EXPORT_C TChar::TCategory TChar::GetCategory() const
   602 /**
   603 Gets this character's Unicode category.
   604 
   605 @return This character's Unicode category.
   606 */
   607 	{
   608 	//for unicode non private user area just use the default charset
   609 	if (iChar>=0xE000 && iChar<=0xF8FF)
   610 		return TUnicode(iChar).GetCategory(GetLocaleCharSet()->iCharDataSet);
   611 	else
   612 		return TUnicode(iChar).GetCategory(GetLocaleDefaultCharSet()->iCharDataSet);
   613 	}
   614 
   615 
   616 
   617 
   618 EXPORT_C TChar::TBdCategory TChar::GetBdCategory() const
   619 /**
   620 Gets the bi-directional category of a character.
   621 
   622 For more information on the bi-directional algorithm, see Unicode Technical 
   623 Report No. 9 available at: http://www.unicode.org/unicode/reports/tr9/.
   624 
   625 @return The character's bi-directional category.
   626 */
   627 	{
   628 	return TUnicode(iChar).GetBdCategory(GetLocaleCharSet()->iCharDataSet);
   629 	}
   630 
   631 
   632 
   633 
   634 EXPORT_C TInt TChar::GetCombiningClass() const
   635 /**
   636 Gets this character's combining class.
   637 
   638 Note that diacritics and other combining characters have non-zero combining 
   639 classes.
   640 
   641 @return The combining class.
   642 */
   643 	{
   644 	//for unicode non private user area just use the default charset
   645 	if (iChar>=0xE000 && iChar<=0xF8FF)
   646 		return TUnicode(iChar).GetCombiningClass(GetLocaleCharSet()->iCharDataSet);
   647 	else
   648 		return TUnicode(iChar).GetCombiningClass(GetLocaleDefaultCharSet()->iCharDataSet);
   649 	}
   650 
   651 
   652 
   653 
   654 EXPORT_C TBool TChar::IsMirrored() const
   655 /**
   656 Tests whether this character has the mirrored property.
   657 
   658 Mirrored characters, like ( ) [ ] < >, change direction according to the
   659 directionality of the surrounding characters. For example, an opening
   660 parenthesis 'faces right' in Hebrew or Arabic, and to say that 2 < 3 you would
   661 have to say that 3 > 2, where the '>' is, in this example, a less-than sign to
   662 be read right-to-left.
   663 
   664 @return True, if this character has the mirrored property; false, otherwise.
   665 */
   666 	{
   667 	return TUnicode(iChar).IsMirrored(GetLocaleCharSet()->iCharDataSet);
   668 	}
   669 
   670 
   671 
   672 
   673 EXPORT_C TInt TChar::GetNumericValue() const
   674 /**
   675 Gets the integer numeric value of this character.
   676 
   677 Numeric values need not be in the range 0..9; the Unicode character set
   678 includes various other numeric characters such as the Roman and Tamil numerals
   679 for 500, 1000, etc.
   680 
   681 @return The numeric value: -1 if the character has no integer numeric 
   682         value,-2 if the character has a fractional numeric value.
   683 */
   684 	{
   685 	return TUnicode(iChar).GetNumericValue(GetLocaleCharSet()->iCharDataSet);
   686 	}
   687 
   688 
   689 
   690 
   691 EXPORT_C TChar::TCjkWidth TChar::GetCjkWidth() const
   692 /**
   693 Gets the Chinese, Japanese, Korean (CJK) notional width.
   694 
   695 Some display systems used in East Asia display characters on a grid of
   696 fixed-width character cells like the standard MSDOS display mode.
   697 
   698 Some characters, e.g. the Japanese katakana syllabary, take up a single
   699 character cell and some characters, e.g., kanji, Chinese characters used in
   700 Japanese, take up two. These are called half-width and full-width characters.
   701 This property is fixed and cannot be overridden for particular locales.
   702 
   703 For more information on returned widths, see Unicode Technical Report 11 on 
   704 East Asian Width available at: http://www.unicode.org/unicode/reports/tr11/
   705 
   706 @return The notional width of an east Asian character.
   707 */
   708 	{
   709 	return TUnicode(iChar).GetCjkWidth();
   710 	}
   711 
   712 
   713 
   714 
   715 /**
   716 Composes a string of Unicode characters to produce a single character result.
   717 
   718 For example, 0061 ('a') and 030A (combining ring above) compose to give 00E5 
   719 ('a' with ring above).
   720 
   721 A canonical decomposition is a relationship between a string of characters -  
   722 usually a base character and one or more diacritics - and a composed character. 
   723 The Unicode standard requires that compliant software treats composed
   724 characters identically with their canonical decompositions. The mappings used
   725 by these functions are fixed and cannot be overridden for particular locales.
   726 
   727 @param aResult If successful, the composed character value. If unsuccessful, 
   728                this value contains 0xFFFF.
   729 @param aSource String of source Unicode characters.
   730 
   731 @return True, if the compose operation is successful in combining the entire
   732 		sequence of characters in the descriptor into a single compound
   733 		character; false, otherwise.
   734 */
   735 
   736 EXPORT_C TBool TChar::Compose(TUint& aResult,const TDesC16& aSource)
   737 	{
   738 	aResult = 0xFFFF;
   739 	if(aSource.Length() > 0)
   740 		{
   741 		TChar combined;
   742 		if(::CombineAsMuchAsPossible(aSource, combined) == aSource.Length())
   743 			{
   744 			aResult = (TUint)combined;
   745 			return ETrue;
   746 			}
   747 		}
   748 	return EFalse;
   749 	}
   750 
   751 
   752 
   753 
   754 /**
   755 Maps this character to its maximal canonical decomposition.
   756 
   757 For example, 01E1 ('a' with dot above and macron) decomposes into 0061 ('a') 
   758 0307 (dot) and 0304 (macron).
   759 
   760 Note that this function is used during collation, as performed by
   761 the Mem::CompareC() function, to convert the compared strings to their maximal
   762 canonical decompositions.
   763 
   764 @param aResult If successful, the descriptor represents the canonical decomposition 
   765                of this character. If unsuccessful, the descriptor is empty.
   766                
   767 @return True if decomposition is successful; false, otherwise.
   768 
   769 @see Mem::CompareC()
   770 @see TChar::Compose()
   771 */
   772 EXPORT_C TBool TChar::Decompose(TPtrC16& aResult) const
   773 	{
   774 	return ::DecomposeChar(iChar, aResult);
   775 	}
   776 
   777 
   778 
   779 
   780 EXPORT_C TInt TFindChunk::Next(TFullName &aResult)
   781 /**
   782 Finds the full name of the next chunk which matches the match pattern.
   783 
   784 @param aResult A reference to a TBuf descriptor with a defined maximum length. 
   785                If a matching chunk is found, its full name is set into
   786                this descriptor.
   787                If no matching chunk is found, the descriptor length is set
   788                to zero.
   789                
   790 @return KErrNone, if a matching chunk is found;
   791         KErrNotFound otherwise.
   792 */
   793 	{
   794 	return NextObject(aResult,EChunk);
   795 	}
   796 
   797 
   798 
   799 
   800 
   801 EXPORT_C TUint8 * RChunk::Base() const
   802 /**
   803 Gets a pointer to the base of the chunk's reserved region.
   804 
   805 @return A pointer to the base of the chunk's reserved region.
   806 */
   807 	{
   808 
   809 	return(Exec::ChunkBase(iHandle));
   810 	}
   811 
   812 
   813 
   814 
   815 EXPORT_C TInt RChunk::Size() const
   816 /**
   817 Gets the current size of this chunk's committed region.
   818 
   819 @return The size of the chunk's committed region.
   820 */
   821 	{
   822 
   823 	return(Exec::ChunkSize(iHandle));
   824 	}
   825 
   826 
   827 
   828 
   829 EXPORT_C TInt RChunk::Bottom() const
   830 /**
   831 Gets the offset of the bottom of the double ended chunk's committed region 
   832 from the base of the chunk's reserved region.
   833 
   834 Note that the lowest valid address in a double ended chunk is the sum of the 
   835 base of the chunk's reserved region plus the value of Bottom().
   836 
   837 @return The offset of the bottom of the chunk's committed region from the 
   838         base of the chunk's reserved region.
   839 */
   840 	{
   841 
   842 	return(Exec::ChunkBottom(iHandle));
   843 	}
   844 
   845 
   846 
   847 
   848 EXPORT_C TInt RChunk::Top() const
   849 /**
   850 Gets the offset of the top of the double ended chunk's committed region 
   851 from the base of the chunk's reserved region.
   852 
   853 Note that the highest valid address in a double ended chunk is the the sum 
   854 of the base of the chunk's reserved region plus the value of Top() - 1.
   855 
   856 @return The offset of the top of the chunk's committed region from the base 
   857         of the chunk's reserved region.
   858 */
   859 	{
   860 
   861 	return(Exec::ChunkTop(iHandle));
   862 	}
   863 
   864 
   865 EXPORT_C TInt RChunk::MaxSize() const
   866 /**
   867 Gets the maximum size of this chunk.
   868 
   869 This maximum size of this chunk is set when the chunk is created.
   870 
   871 @return The maximum size of this chunk.
   872 */
   873 	{
   874 
   875 	return(Exec::ChunkMaxSize(iHandle));
   876 	}
   877 
   878 /**
   879 Finds the full name of the next LDD factory object which matches the match pattern.
   880 
   881 @param aResult A reference to a TBuf descriptor with a defined maximum length. 
   882                If a matching LDD factory object is found, its full name is set into
   883                this descriptor.
   884                If no matching LDD factory object is found, the descriptor length is set
   885                to zero.
   886                
   887 @return KErrNone, if a matching LDD factory object is found;
   888         KErrNotFound otherwise.
   889 */
   890 EXPORT_C TInt TFindLogicalDevice::Next(TFullName &aResult)
   891 	{
   892 	return NextObject(aResult,ELogicalDevice);
   893 	}
   894 
   895 /**
   896 Finds the full name of the next PDD factory object which matches the match pattern.
   897 
   898 @param aResult A reference to a TBuf descriptor with a defined maximum length. 
   899                If a matching PDD factory object is found, its full name is set into
   900                this descriptor.
   901                If no matching PDD factory object is found, the descriptor length is set
   902                to zero.
   903                
   904 @return KErrNone, if a matching PDD factory object is found;
   905         KErrNotFound otherwise.
   906 */
   907 EXPORT_C TInt TFindPhysicalDevice::Next(TFullName &aResult)
   908 	{
   909 	return NextObject(aResult,EPhysicalDevice);
   910 	}
   911 
   912 /**
   913 Gets the device capabilities.
   914 
   915 @param aDes	A descriptor into which capability's information is to be written.
   916 */
   917 EXPORT_C void RDevice::GetCaps(TDes8 &aDes) const
   918 	{
   919 
   920 	Exec::LogicalDeviceGetCaps(iHandle,aDes);
   921 	}
   922 
   923 /**
   924 Checks if a device supports a particular version.
   925 
   926 @param aVer	The requested device version.
   927 
   928 @return	ETrue if supported, EFalse if not.
   929 */
   930 EXPORT_C TBool RDevice::QueryVersionSupported(const TVersion &aVer) const
   931 	{
   932 
   933 	return(Exec::LogicalDeviceQueryVersionSupported(iHandle,aVer));
   934 	}
   935 
   936 /**
   937 Checks if a specified unit number, additional info and a specific PDD is supported.
   938 
   939 @param aUnit			The requested unit number.
   940 @param aPhysicalDevice	The requested PDD name.
   941 @param anInfo			The additional information.
   942 
   943 @return ETrue if supported, EFalse if not. 
   944 */
   945 EXPORT_C TBool RDevice::IsAvailable(TInt aUnit, const TDesC* aPhysicalDevice, const TDesC8* anInfo) const
   946 	{
   947 	TInt r;
   948 	if(aPhysicalDevice)
   949 		{
   950 		TBuf8<KMaxKernelName> physicalDevice;
   951 		physicalDevice.Copy(*aPhysicalDevice);
   952 		r = Exec::LogicalDeviceIsAvailable(iHandle,aUnit,(TDesC8*)&physicalDevice,anInfo);
   953 		}
   954 	else
   955 		r = Exec::LogicalDeviceIsAvailable(iHandle,aUnit,(TDesC8*)NULL,anInfo);
   956 
   957 	return r;
   958 	}
   959 
   960 
   961 /**
   962 Queues an asynchronous request for the device driver, taking no parameters.
   963  
   964 The request is handled on the kernel-side by the logical channel's
   965 DLogicalChannelBase::Request().
   966 
   967 Outstanding requests can be cancelled by calling DoCancel().
   968 
   969 @param aReqNo   A number identifying the request to the logical channel. 
   970 @param aStatus  The request status object for this request.     
   971 */
   972 EXPORT_C void RBusLogicalChannel::DoRequest(TInt aReqNo,TRequestStatus &aStatus)
   973 	{
   974 
   975 	TAny *a[2];
   976 	a[0]=NULL;
   977 	a[1]=NULL;
   978 	aStatus=KRequestPending;
   979 	Exec::ChannelRequest(iHandle,~aReqNo,&aStatus,&a[0]);
   980 	}
   981 
   982 
   983 
   984 
   985 /**
   986 Queues an asynchronous request for the device driver, taking one parameter.
   987  
   988 The request is handled on the kernel-side by the logical channel's
   989 DLogicalChannelBase::Request().
   990 
   991 Outstanding requests can be cancelled by calling DoCancel().
   992 
   993 @param aReqNo   A number identifying the request to the logical channel. 
   994 @param aStatus  The request status object for this request.
   995 @param a1       A 32-bit value passed to the kernel-side. Its meaning depends
   996                 on the device driver requirements.           
   997 */
   998 EXPORT_C void RBusLogicalChannel::DoRequest(TInt aReqNo,TRequestStatus &aStatus,TAny *a1)
   999 	{
  1000 
  1001 	TAny *a[2];
  1002 	a[0]=a1;
  1003 	a[1]=NULL;
  1004 	aStatus=KRequestPending;
  1005 	Exec::ChannelRequest(iHandle,~aReqNo,&aStatus,&a[0]);
  1006 	}
  1007 
  1008 
  1009 
  1010 
  1011 /**
  1012 Queues an asynchronous request for the device driver, taking two parameters.
  1013  
  1014 The request is handled on the kernel-side by the logical channel's
  1015 DLogicalChannelBase::Request().
  1016 
  1017 Outstanding requests can be cancelled by calling DoCancel().
  1018 
  1019 @param aReqNo   A number identifying the request to the logical channel. 
  1020 @param aStatus  The request status object for this request.
  1021 @param a1       A 32-bit value passed to the kernel-side. Its meaning depends
  1022                 on the device driver requirements.           
  1023 @param a2       A 32-bit value passed to the kernel-side. Its meaning depends
  1024                 on the device driver requirements.           
  1025 */
  1026 EXPORT_C void RBusLogicalChannel::DoRequest(TInt aReqNo,TRequestStatus &aStatus,TAny *a1,TAny *a2)
  1027 	{
  1028 
  1029 	TAny *a[2];
  1030 	a[0]=a1;
  1031 	a[1]=a2;
  1032 	aStatus=KRequestPending;
  1033 	Exec::ChannelRequest(iHandle,~aReqNo,&aStatus,&a[0]);
  1034 	}
  1035 
  1036 
  1037 
  1038 
  1039 /**
  1040 Cancels one or more outstanding asynchronous requests.
  1041 
  1042 All outstanding requests complete with KErrCancel.
  1043 
  1044 @param aRequestMask A set of bits identifying the requests to be cancelled.
  1045                     Each bit can be used to identify a separate outstanding
  1046                     request. It is up to the driver to define how the bits map
  1047                     to those outstanding requests.
  1048 */
  1049 EXPORT_C void RBusLogicalChannel::DoCancel(TUint aRequestMask)
  1050 	{
  1051 
  1052 	Exec::ChannelRequest(iHandle,KMaxTInt,(TAny*)aRequestMask,0);
  1053 	}
  1054 
  1055 
  1056 
  1057 
  1058 /**
  1059 Makes a synchronous request to the device driver, taking no parameters.
  1060 
  1061 This function does not return until the request has completed, successfully
  1062 or otherwise.
  1063 
  1064 @param aFunction A number identifying the request.
  1065 
  1066 @return KErrNone, if successful; otherwise one of the other system-wide
  1067         error codes.
  1068         The value returned depends on the implementation of the device driver.
  1069 */
  1070 EXPORT_C TInt RBusLogicalChannel::DoControl(TInt aFunction)
  1071 	{
  1072 
  1073 	return Exec::ChannelRequest(iHandle,aFunction,NULL,NULL);
  1074 	}
  1075 
  1076 
  1077 
  1078 
  1079 /**
  1080 Makes a synchronous request to the device driver, taking one parameter.
  1081 
  1082 This function does not return until the request has completed, successfully
  1083 or otherwise.
  1084 
  1085 @param aFunction A number identifying the request.
  1086 @param a1        A 32-bit value passed to the kernel-side. Its meaning depends
  1087                  on the device driver requirements.           
  1088 
  1089 @return KErrNone, if successful; otherwise one of the other system-wide
  1090         error codes.
  1091         The value returned depends on the implementation of the device driver.
  1092 */
  1093 EXPORT_C TInt RBusLogicalChannel::DoControl(TInt aFunction,TAny *a1)
  1094 	{
  1095 
  1096 	return Exec::ChannelRequest(iHandle,aFunction,a1,NULL);
  1097 	}
  1098 
  1099 
  1100 
  1101 
  1102 /**
  1103 Makes a synchronous request to the device driver, taking two parameters.
  1104 
  1105 This function does not return until the request has completed, successfully
  1106 or otherwise.
  1107 
  1108 @param aFunction A number identifying the request.
  1109 @param a1        A 32-bit value passed to the kernel-side. Its meaning depends
  1110                  on the device driver requirements.           
  1111 @param a2        A 32-bit value passed to the kernel-side. Its meaning depends
  1112                  on the device driver requirements.           
  1113 
  1114 @return KErrNone, if successful; otherwise one of the other system-wide
  1115         error codes.
  1116         The value returned depends on the implementation of the device driver.
  1117 */
  1118 EXPORT_C TInt RBusLogicalChannel::DoControl(TInt aFunction,TAny *a1,TAny *a2)
  1119 	{
  1120 
  1121 	return Exec::ChannelRequest(iHandle,aFunction,a1,a2);
  1122 	}
  1123 
  1124 
  1125 
  1126 
  1127 EXPORT_C void User::WaitForAnyRequest()
  1128 /**
  1129 Waits for any asynchronous request to complete.
  1130 
  1131 The current thread waits on its request semaphore.
  1132 
  1133 The function completes, and control returns to the caller when the current 
  1134 thread's request semaphore is signalled by any of the service providers which 
  1135 handle these asynchronous requests.
  1136 
  1137 The request status of all outstanding asynchronous requests must be examined 
  1138 to determine which request is complete.
  1139 
  1140 @see TRequestStatus
  1141 */
  1142 	{
  1143 
  1144 	Exec::WaitForAnyRequest();
  1145 	}
  1146 
  1147 
  1148 
  1149 
  1150 EXPORT_C void User::WaitForRequest(TRequestStatus &aStatus)
  1151 /**
  1152 Waits for a specific asynchronous request to complete.
  1153 
  1154 The current thread waits on its request semaphore.
  1155 
  1156 The function completes and control returns to the caller when the current 
  1157 thread's request semaphore is signalled by the service provider handling the 
  1158 request associated with aStatus. Before signalling, the service provider sets 
  1159 an appropriate value in aStatus, other than KRequestPending.
  1160 
  1161 Note that if other asynchronous requests complete before the one associated
  1162 with aStatus, the request semaphore is adjusted so that knowledge of their
  1163 completion is not lost. In this a case, a subsequent call to
  1164 User::WaitForAnyRequest() or User::WaitForRequest() will complete and return
  1165 immediately.
  1166 
  1167 @param aStatus A reference to the request status object associated with the 
  1168                specific asynchronous request.
  1169                
  1170 @see KRequestPending
  1171 */
  1172 	{
  1173 
  1174 	TInt i=(-1);
  1175 	do
  1176 		{
  1177 		i++;
  1178 		Exec::WaitForAnyRequest();
  1179 		} while (aStatus==KRequestPending);
  1180 	if (i)
  1181 		Exec::RequestSignal(i);
  1182 	}
  1183 
  1184 
  1185 
  1186 
  1187 EXPORT_C void User::WaitForRequest(TRequestStatus &aStatus1,TRequestStatus &aStatus2)
  1188 /**
  1189 Waits for either of two specific asynchronous requests to complete.
  1190 
  1191 The current thread waits on its request semaphore.
  1192 
  1193 The function completes and control returns to the caller when the current 
  1194 thread's request semaphore is signalled by either the service provider handling 
  1195 the request associated with aStatus1 or the service provider handling the 
  1196 request associated with aStatus2. Before signalling, the completing service 
  1197 provider sets an appropriate value in the status object, other
  1198 than KRequestPending.
  1199 
  1200 Note that if other asynchronous requests complete before the ones associated
  1201 with aStatus1 and aStatus2, the request semaphore is adjusted so that knowledge
  1202 of their completion is not lost. In this a case, a subsequent call to
  1203 User::WaitForAnyRequest() or User::WaitForRequest() will complete and return
  1204 immediately.
  1205 
  1206 @param aStatus1 A reference to the request status object associated with the 
  1207                 first specific asynchronous request.
  1208 @param aStatus2 A reference to the request status object associated with the 
  1209                 second specific asynchronous request.
  1210 
  1211 @see KRequestPending                
  1212 */
  1213 	{
  1214 
  1215 	TInt i=(-1);
  1216 	do
  1217 		{
  1218 		i++;
  1219 		Exec::WaitForAnyRequest();
  1220 		} while (aStatus1==KRequestPending && aStatus2==KRequestPending);
  1221 	if (i)
  1222 		Exec::RequestSignal(i);
  1223 	}
  1224 
  1225 
  1226 
  1227 
  1228 EXPORT_C void User::WaitForNRequest(TRequestStatus * aStatusArray[], TInt aNum)
  1229 /**
  1230  Waits for any one of  specific asynchronous requests to complete.
  1231   
  1232 The current thread waits on its request semaphore.
  1233 
  1234 The function completes and control returns to the caller when the current 
  1235 thread's request semaphore is signalled by the service provider handling 
  1236 the request associated with any member of aStatusArray[]. Before signalling, 
  1237 the completing service provider sets an appropriate value in the status object, 
  1238 other than KRequestPending.
  1239  
  1240 Note that if other asynchronous requests complete before the ones associated
  1241 with aStatusArray the request semaphore is adjusted so that knowledge
  1242 of their completion is not lost. In this a case, a subsequent call to
  1243 User::WaitForAnyRequest() or User::WaitForRequest() will complete and return
  1244 immediately. 
  1245 @param aStatusArray[] 	An array of pointers to the request status objects
  1246 @param TInt aNum    	The size of aStatusArray[]
  1247 */
  1248 	{
  1249      	TRequestStatus* aptr;
  1250      	TBool m = ETrue;
  1251      	TInt i = (-1);
  1252      	do
  1253 		{
  1254 	 	i++;
  1255         	Exec::WaitForAnyRequest();
  1256         	for(TInt j = 0; j<aNum; j++)
  1257         		{
  1258          		aptr =  aStatusArray[j];
  1259          		if(aptr)
  1260          			{
  1261          			if(aptr->Int()!= KRequestPending)
  1262          				{	
  1263          				m = EFalse;	
  1264          				break;
  1265          				}
  1266          			}
  1267         		}
  1268      		}while(m);
  1269 	if(i)
  1270 		Exec::RequestSignal(i);	
  1271 	}
  1272 
  1273 
  1274 
  1275 
  1276 EXPORT_C TInt TFindLibrary::Next(TFullName &aResult)
  1277 /**
  1278 Finds the next DLL whose full name matches the match pattern.
  1279 
  1280 If a DLL with a matching name is found, the function copies the full name of
  1281 the DLL into the descriptor aResult.
  1282 
  1283 @param aResult A buffer for the fullname of the DLL. This is a template
  1284                specialisation of TBuf defining a modifiable buffer descriptor
  1285                taking a maximum length of KMaxFullName.
  1286                If no matching DLL is found, the descriptor length is
  1287                set to zero. 
  1288                
  1289 @return KErrNone, if a matching DLL is found;
  1290         KErrNotFound, otherwise.
  1291 */
  1292 	{
  1293 	return NextObject(aResult,ELibrary);
  1294 	}
  1295 
  1296 
  1297 
  1298 
  1299 EXPORT_C TLibraryFunction RLibrary::Lookup(TInt anOrdinal) const
  1300 /**
  1301 Gets a pointer to the function at the specified ordinal within this DLL.
  1302 
  1303 @param anOrdinal The ordinal of the required function in this DLL.
  1304                  This value must be positive.
  1305 
  1306 @return A pointer to the function at position anOrdinal in this DLL.
  1307         The value is NULL if there is no function at that ordinal. 
  1308         
  1309 @panic USER 116 if anOrdinal is negative
  1310 */
  1311 	{
  1312 	__ASSERT_ALWAYS(anOrdinal>=0,Panic(EBadLookupOrdinal));
  1313 	return (Exec::LibraryLookup(iHandle,anOrdinal));
  1314 	}
  1315 
  1316 
  1317 
  1318 EXPORT_C TFileName RLibrary::FileName() const
  1319 /**
  1320 Gets the name of the DLL's file.
  1321 
  1322 @return The DLL's filname.
  1323 */
  1324 	{
  1325 
  1326 	TFileName n;
  1327 	TPtr8 n8(((TUint8*)n.Ptr()) + KMaxFileName, KMaxFileName);
  1328 	Exec::LibraryFileName(iHandle,n8);
  1329 	n.Copy(n8);
  1330 	return(n);
  1331 	}
  1332 
  1333 
  1334 
  1335 
  1336 EXPORT_C TUidType RLibrary::Type() const
  1337 /**
  1338 Gets this DLL's UID type.
  1339 
  1340 The UID type is a property of a Symbian OS file; for a DLL, its value is set
  1341 during the building of that DLL.
  1342 
  1343 @return The UID type of this DLL. Note that the first TUid component of
  1344         the TUidType has the value KDynamicLibraryUid.
  1345 */
  1346 	{
  1347 
  1348 	TUidType u;
  1349 	Exec::LibraryType(iHandle,u);
  1350 	return(u);
  1351 	}
  1352 
  1353 
  1354 
  1355 
  1356 EXPORT_C TInt RLibrary::GetRamSizes(TInt& aCodeSize, TInt& aConstDataSize)
  1357 /**
  1358 Gets the current size of the code and the const data for this DLL.
  1359 
  1360 This function can be called on a RAM loaded DLL or a ROM based DLL.
  1361 
  1362 @param aCodeSize      The current size of the code for a RAM loaded DLL.
  1363                       This is zero for a ROM based DLL.
  1364 
  1365 @param aConstDataSize The current size of the const data for a RAM loaded DLL.
  1366                       This is zero for a ROM based DLL.
  1367 
  1368 @return KErrNone if successful, otherwise one of the system-wide error codes. 
  1369 */
  1370 	{
  1371 	TModuleMemoryInfo info;
  1372 	TInt r=Exec::LibraryGetMemoryInfo(iHandle,info);
  1373 	if (r==KErrNone)
  1374 		{
  1375 		aCodeSize=info.iCodeSize;
  1376 		aConstDataSize=info.iConstDataSize;
  1377 		}
  1378 	return r;
  1379 	}
  1380 
  1381 
  1382 
  1383 
  1384 /**
  1385 Sets the home time to a specified time value.
  1386 
  1387 @param aTime A reference to a time representation object containing the time 
  1388              value.
  1389              
  1390 @return KErrNone if successful or one of the system-wide error codes.
  1391 
  1392 @deprecated Set the time using User::SetUTCTime if the UTC time is known;
  1393 			otherwise, use the timezone server to set the time.
  1394 
  1395 @capability WriteDeviceData
  1396 */
  1397 EXPORT_C TInt User::SetHomeTime(const TTime &aTime)
  1398 	{
  1399 	return(Exec::SetUTCTimeAndOffset(aTime.Int64(),0,ETimeSetTime|ETimeSetLocalTime,0));
  1400 	}
  1401 
  1402 /**
  1403 Sets the secure home time to a specified time value.
  1404 
  1405 @param aTime A reference to a time representation object containing the 
  1406 			 secure time value.
  1407              
  1408 @return KErrNone if successful or one of the system-wide error codes.
  1409 
  1410 @capability TCB
  1411 @capability WriteDeviceData
  1412 */
  1413 EXPORT_C TInt User::SetHomeTimeSecure(const TTime &aTime)
  1414 	{
  1415 	return(Exec::SetUTCTimeAndOffset(aTime.Int64(),0,ETimeSetTime|ETimeSetLocalTime|ETimeSetSecure,0));
  1416 	}
  1417 
  1418 
  1419 
  1420 /**
  1421 Sets the UTC time to a specified time value.
  1422 
  1423 @param aUTCTime A reference to a time representation object containing the time 
  1424                 value.
  1425              
  1426 @return KErrNone if successful or one of the system-wide error codes.
  1427 
  1428 @capability WriteDeviceData
  1429 */
  1430 EXPORT_C TInt User::SetUTCTime(const TTime &aUTCTime)
  1431 	{
  1432 	return(Exec::SetUTCTimeAndOffset(aUTCTime.Int64(),0,ETimeSetTime,0));
  1433 	}
  1434 
  1435 /**
  1436 Sets the secure UTC time to a specified time value.
  1437 
  1438 @param aUTCTime A reference to a time representation object containing the secure time 
  1439                 value.
  1440              
  1441 @return KErrNone if successful or one of the system-wide error codes.
  1442 
  1443 @capability TCB
  1444 @capability WriteDeviceData
  1445 */
  1446 EXPORT_C TInt User::SetUTCTimeSecure(const TTime &aUTCTime)
  1447 	{
  1448 	return(Exec::SetUTCTimeAndOffset(aUTCTime.Int64(),0,ETimeSetTime|ETimeSetSecure,0));
  1449 	}
  1450 
  1451 /**
  1452 Gets the UTC offset - the difference between UTC and the current local time
  1453 due to any time zones and daylight savings time that may be in effect. A positive
  1454 offset indicates a time ahead of UTC, a negative offset indicates a time behind UTC.
  1455 
  1456 @return The UTC offset, in seconds.
  1457 */
  1458 EXPORT_C TTimeIntervalSeconds User::UTCOffset()
  1459 	{
  1460 	return(TTimeIntervalSeconds(Exec::UTCOffset()));
  1461 	}
  1462 
  1463 
  1464 /**
  1465 Sets the UTC offset to the given number of seconds. This should include both time
  1466 zone differences and the effect of any applicable daylight savings time.
  1467 A positive offset indicates a time ahead of UTC, a negative offset indicates a time
  1468 behind UTC.
  1469 
  1470 @param aOffset The UTC offset, in seconds.
  1471 
  1472 @capability WriteDeviceData
  1473 */
  1474 EXPORT_C void User::SetUTCOffset(TTimeIntervalSeconds aOffset)
  1475 	{
  1476 	Exec::SetUTCTimeAndOffset(0,aOffset.Int(),ETimeSetOffset,0);
  1477 	}
  1478 
  1479 
  1480 /**
  1481 Sets the UTC time and UTC offset to the specified values, atomically. This is equivalent
  1482 to calling both SetUTCTime and SetUTCOffset, but without the possibility of an incorrect
  1483 time being observed between the two calls. If the operation is not successful, an error
  1484 code will be returned and both the time and offset will be left unchanged.
  1485 
  1486 @param aUTCTime A reference to a time representation object containing the time 
  1487                 value.
  1488 @param aOffset The UTC offset, in seconds.
  1489              
  1490 @return KErrNone if successful or one of the system-wide error codes.
  1491 
  1492 @capability WriteDeviceData
  1493 */
  1494 EXPORT_C TInt User::SetUTCTimeAndOffset(const TTime &aUTCTime, TTimeIntervalSeconds aOffset)
  1495 	{
  1496 	return(Exec::SetUTCTimeAndOffset(aUTCTime.Int64(),aOffset.Int(),ETimeSetTime|ETimeSetOffset,0));
  1497 	}
  1498 
  1499 
  1500 /**
  1501 Gets the current tick count.
  1502 
  1503 The period between ticks is usually 1/64 second, but may be hardware dependent.
  1504 
  1505 @return The machine dependent tick count.
  1506 */
  1507 EXPORT_C TUint User::TickCount()
  1508 	{
  1509 
  1510 	return(Exec::TickCount());
  1511 	}
  1512 
  1513 
  1514 
  1515 
  1516 EXPORT_C TTimeIntervalSeconds User::InactivityTime()
  1517 /**
  1518 Gets the time since the last user activity.
  1519 
  1520 @return The time interval.
  1521 */
  1522 	{
  1523 
  1524 	return TTimeIntervalSeconds(Exec::UserInactivityTime());
  1525 	}
  1526 
  1527 
  1528 
  1529 
  1530 /**
  1531 Resets all user inactivity timers.
  1532 */
  1533 EXPORT_C void User::ResetInactivityTime()
  1534 	{
  1535 	Exec::ResetInactivityTime();
  1536 	}
  1537 
  1538 
  1539 
  1540 
  1541 /**
  1542 Gets the nanokernel tick count.
  1543 
  1544 This is the current value of the machine's millisecond tick counter.
  1545 
  1546 On the emulator the resolution defaults to 5 milliseconds; however
  1547 you can change it to N milliseconds when you launch the emulator
  1548 from the command line by specifying -Dtimerresolution=N as a parameter
  1549 to epoc.exe, for example:
  1550 @code
  1551 epoc.exe -Dtimerresolution=3
  1552 @endcode
  1553 
  1554 On most hardware the resolution is about 1 millisecond.
  1555 
  1556 You can get the nanokernel tick period in microseconds by calling
  1557 into the Hardware Abstraction Layer:
  1558 
  1559 @code
  1560 TInt nanokernel_tick_period;
  1561 HAL::Get(HAL::ENanoTickPeriod, nanokernel_tick_period);
  1562 @endcode
  1563 
  1564 @return The nanokernel tick count.
  1565 */
  1566 EXPORT_C TUint32 User::NTickCount()
  1567 	{
  1568 
  1569 	return Exec::NTickCount();
  1570 	}
  1571 
  1572 
  1573 
  1574 
  1575 /**
  1576 Gets the fast counter.
  1577 
  1578 This is the current value of the machine's high resolution timer.  If a high
  1579 resolution timer is not available, it uses the millisecond timer instead.
  1580 
  1581 The freqency of this counter can be determined by reading the HAL attribute
  1582 EFastCounterFrequency.
  1583 
  1584 This function is intended for use in profiling and testing; it should not be
  1585 used in production code. User::NTickCount() should be used instead.
  1586 
  1587 This is because the implementation of the FastCounter is platform-specific:
  1588 its frequency can be anywhere from a few KHz to many MHz. It may also not
  1589 be activated when needed, since it is expensive in terms of clock cycles and
  1590 battery life, and use of a platform-specific API may be necessary to enable
  1591 it.
  1592 
  1593 @return The fast counter value.
  1594 
  1595 @see User::NTickCount()
  1596 */
  1597 EXPORT_C TUint32 User::FastCounter()
  1598 	{
  1599 
  1600 	return Exec::FastCounter();
  1601 	}
  1602 
  1603 
  1604 
  1605 
  1606 EXPORT_C TTimerLockSpec User::LockPeriod()
  1607 /**
  1608 Returns which of the periods the clock is currently in.
  1609 
  1610 @return The fraction of a second at which the timer completes.
  1611 */
  1612 	{
  1613 
  1614 	return(Exec::LockPeriod());
  1615 	}
  1616 
  1617 
  1618 
  1619 
  1620 EXPORT_C TName RHandleBase::Name() const
  1621 /**
  1622 Gets the name of the handle.
  1623 
  1624 @return The name of the handle.
  1625 */
  1626 	{
  1627 
  1628 	TName n;
  1629 	TPtr8 n8(((TUint8*)n.Ptr()) + KMaxName, KMaxName);
  1630 	Exec::HandleName(iHandle,n8);
  1631 	n.Copy(n8);
  1632 	return(n);
  1633 	}
  1634 
  1635 
  1636 
  1637 
  1638 EXPORT_C TFullName RHandleBase::FullName() const
  1639 /**
  1640 Gets the full name of the handle.
  1641 
  1642 Note: This method is stack consuming (it takes 512 bytes on stack to execute).
  1643 For an alternative way to obtain the full name of the object, see RHandleBase::FullName(TDes& aName) const.
  1644 
  1645 @see RHandleBase::FullName(TDes& aName) const
  1646 @return The full name of the handle.
  1647 */
  1648 	{
  1649 
  1650 	TFullName n;
  1651 	TPtr8 n8(((TUint8*)n.Ptr()) + KMaxFullName, KMaxFullName);
  1652 	Exec::HandleFullName(iHandle,n8);
  1653 	n.Copy(n8);
  1654 	return(n);
  1655 	}
  1656 
  1657 
  1658 
  1659 
  1660 EXPORT_C void RHandleBase::FullName(TDes& aName) const
  1661 /**
  1662 Gets the full name of the handle.
  1663 
  1664 @param aName On return, contains the full name of the handle.
  1665 
  1666 @panic KERN-EXEC 35, If full name of the handler is longer that the maximum length of aName descriptor.
  1667 					 To avoid this, the maximum length of aName should be at least KMaxFullName.
  1668 @see KMaxFullName
  1669 */
  1670 	{
  1671 
  1672 	// Kernel will copy string in n8, whose data lives in the upper half of aName desciptor data
  1673 	TPtr8 n8(((TUint8*)aName.Ptr()) + aName.MaxLength(), aName.MaxLength());
  1674 	Exec::HandleFullName(iHandle,n8);
  1675 	aName.Copy(n8); // Expands 8bit descriptor into 16bit unicode descriptor.
  1676 	}
  1677 
  1678 
  1679 
  1680 
  1681 EXPORT_C void RHandleBase::HandleInfo(THandleInfo* anInfo)
  1682 /**
  1683 Gets information about the handle.
  1684 
  1685 @param anInfo A pointer to a THandleInfo object supplied by the caller;
  1686               on return, contains the handle information. 
  1687 */
  1688 	{
  1689 
  1690 	Exec::HandleInfo(iHandle,anInfo);
  1691 	}
  1692 
  1693 EXPORT_C TInt RHandleBase::BTraceId() const
  1694 /**
  1695 Returns a unique object identifier for use with BTrace
  1696 */
  1697 	{
  1698 	return Exec::GetBTraceId(iHandle);
  1699 	}
  1700 
  1701 
  1702 
  1703 EXPORT_C TUint RHandleBase::Attributes() const
  1704 //
  1705 // Get handle attributes
  1706 //
  1707 	{
  1708 
  1709 	return Exec::HandleAttributes(iHandle);
  1710 	}
  1711 
  1712 
  1713 
  1714 
  1715 EXPORT_C TInt User::AllocLen(const TAny *aCell)
  1716 /**
  1717 Gets the length of the specified allocated heap cell.
  1718 
  1719 The cell is assumed to be in the current thread's heap.
  1720 
  1721 @param aCell A pointer to the allocated cell whose length
  1722              is to be fetched.
  1723 
  1724 @return The length of the allocated cell.
  1725 */
  1726 	{
  1727 
  1728 	return(GetHeap()->AllocLen(aCell));
  1729 	}
  1730 
  1731 
  1732 
  1733 
  1734 EXPORT_C TAny* User::Alloc(TInt aSize)
  1735 /**
  1736 Allocates a cell of specified size from the current thread's heap.
  1737 
  1738 If there is insufficient memory available on the heap from which to allocate a cell 
  1739 of the required size, the function returns NULL.
  1740 
  1741 The resulting size of the allocated cell may be rounded up to a value greater 
  1742 than aSize, but is guaranteed to be not less than aSize.
  1743 
  1744 @param aSize The size of the cell to be allocated from the current thread's 
  1745              heap.
  1746              
  1747 @return A pointer to the allocated cell. NULL, if there is insufficient memory 
  1748         available.
  1749         
  1750 @panic USER 47, if the maximum unsigned value of aSize is greater
  1751                 than or equal to KMaxTInt/2. For example,
  1752                 calling Alloc(-1) raises this panic.
  1753 */
  1754 	{
  1755 
  1756 	return(GetHeap()->Alloc(aSize));
  1757 	}
  1758 
  1759 
  1760 
  1761 
  1762 EXPORT_C TAny* User::AllocL(TInt aSize)
  1763 /**
  1764 Allocates a cell of specified size from the current thread's heap, and leaves 
  1765 if there is insufficient memory in the heap.
  1766 
  1767 The resulting size of the allocated cell may be rounded up to a value greater 
  1768 than aSize, but is guaranteed to be not less than aSize.
  1769 
  1770 @param aSize The size of the cell to be allocated from the current thread's 
  1771              heap.
  1772 
  1773 @return A pointer to the allocated cell.
  1774 
  1775 @panic USER 47, if the maximum unsigned value of aSize is greater
  1776                 than or equal to KMaxTInt/2. For example,
  1777                 calling Alloc(-1) raises this panic.
  1778 */
  1779 	{
  1780 
  1781 	return(GetHeap()->AllocL(aSize));
  1782 	}
  1783 
  1784 
  1785 
  1786 
  1787 EXPORT_C TAny *User::AllocLC(TInt aSize)
  1788 /**
  1789 Allocates a cell of specified size from the current thread's default heap, and,
  1790 if successful, places a pointer to the cell onto the cleanup stack.
  1791 
  1792 The function leaves if there is insufficient memory in the heap.
  1793 
  1794 The resulting size of the allocated cell may be rounded up to a value greater 
  1795 than aSize, but is guaranteed to be not less than aSize.
  1796 
  1797 @param aSize The size of the cell to be allocated from the current thread's
  1798              default heap.
  1799              
  1800 @return A pointer to the allocated cell.
  1801 
  1802 @panic USER 47, if the maximum unsigned value of aSize is greater
  1803                 than or equal to KMaxTInt/2. For example,
  1804                 calling Alloc(-1) raises this panic.
  1805 */
  1806 	{
  1807 
  1808 	return(GetHeap()->AllocLC(aSize));
  1809 	}
  1810 
  1811 
  1812 
  1813 
  1814 EXPORT_C TAny* User::AllocZ(TInt aSize)
  1815 /**
  1816 Allocates a cell of specified size from the current thread's default heap,
  1817 and clears it to binary zeroes.
  1818 
  1819 If there is insufficient memory available on the heap from which to allocate a cell 
  1820 of the required size, the function returns NULL.
  1821 
  1822 The resulting size of the allocated cell may be rounded up to a value greater 
  1823 than aSize, but is guaranteed to be not less than aSize.
  1824 
  1825 @param aSize The size of the cell to be allocated from the current thread's 
  1826              default heap.
  1827              
  1828 @return A pointer to the allocated cell. NULL, if there is insufficient memory 
  1829         available.
  1830         
  1831 @panic USER 47, if the maximum unsigned value of aSize is greater
  1832                 than or equal to KMaxTInt/2. For example,
  1833                 calling Alloc(-1) raises this panic.
  1834 */
  1835 	{
  1836 
  1837 	return GetHeap()->AllocZ(aSize);
  1838 	}
  1839 
  1840 
  1841 
  1842 
  1843 EXPORT_C TAny* User::AllocZL(TInt aSize)
  1844 /**
  1845 Allocates a cell of specified size from the current thread's default heap,
  1846 clears it to binary zeroes, and leaves if there is insufficient memory in
  1847 the heap.
  1848 
  1849 The resulting size of the allocated cell may be rounded up to a value greater 
  1850 than aSize, but is guaranteed to be not less than aSize.
  1851 
  1852 @param aSize The size of the cell to be allocated from the current thread's 
  1853              heap.
  1854 
  1855 @return A pointer to the allocated cell.
  1856 
  1857 @panic USER 47, if the maximum unsigned value of aSize is greater
  1858                 than or equal to KMaxTInt/2. For example,
  1859                 calling Alloc(-1) raises this panic.
  1860 */
  1861 	{
  1862 
  1863 	return GetHeap()->AllocZL(aSize);
  1864 	}
  1865 
  1866 
  1867 
  1868 
  1869 EXPORT_C TInt User::Available(TInt &aBiggestBlock)
  1870 /**
  1871 Gets the total free space currently available on the current thread's 
  1872 default heap, and the space available in the largest free block.
  1873 
  1874 The space available represents the total space which can be allocated.
  1875 
  1876 Note that compressing the heap may reduce the total free space available and the space 
  1877 available in the largest free block.
  1878 
  1879 @param aBiggestBlock On return, contains the space available in the largest
  1880                      free block on the current thread's default heap.
  1881                      
  1882 @return The total free space currently available on the current thread's heap.
  1883 */
  1884 	{
  1885 
  1886 	return(GetHeap()->Available(aBiggestBlock));
  1887 	}
  1888 
  1889 
  1890 
  1891 
  1892 EXPORT_C void User::Check()
  1893 /**
  1894 Checks the validity of the current thread's default heap.
  1895 
  1896 The function walks through the list of allocated cells and the list of free
  1897 cells checking that the heap is consistent and complete.
  1898 
  1899 @panic USER 47 if any corruption is found, specifically	a bad allocated
  1900                heap cell size.
  1901 @panic USER 48 if any corruption is found, specifically a bad allocated
  1902                heap cell address.
  1903 @panic USER 49 if any corruption is found, specifically a bad free heap
  1904                cell address.
  1905 */
  1906 	{
  1907 
  1908 	GetHeap()->Check();
  1909 	}
  1910 
  1911 
  1912 
  1913 
  1914 EXPORT_C void User::Free(TAny *aCell)
  1915 /**
  1916 Frees the specified cell and returns it to the current thread's default heap.
  1917 
  1918 @param aCell A pointer to a valid cell to be freed. If NULL this function 
  1919              call will be ignored.
  1920              
  1921 @panic USER 42, if aCell is not NULL and does not point to a valid cell.
  1922 */
  1923 	{
  1924 
  1925 	if (aCell)
  1926 		GetHeap()->Free(aCell);
  1927 	}
  1928 
  1929 
  1930 
  1931 
  1932 EXPORT_C void User::FreeZ(TAny * &aCell)
  1933 /**
  1934 Frees the specified cell, returns it to the current thread's default heap, and resets 
  1935 the pointer to NULL.
  1936 
  1937 @param aCell A reference to a pointer to a valid cell to be freed. If NULL 
  1938              this function call will be ignored.
  1939              
  1940 @panic USER 42, if aCell is not NULL and does not point to a valid cell.             
  1941 */
  1942 	{
  1943 
  1944 	if (aCell)
  1945 		GetHeap()->FreeZ(aCell);
  1946 	}
  1947 
  1948 
  1949 
  1950 
  1951 EXPORT_C TAny* User::ReAlloc(TAny* aCell, TInt aSize, TInt aMode)
  1952 /**
  1953 Increases or decreases the size of an existing cell in the current
  1954 thread's heap.
  1955 
  1956 If the cell is being decreased in size, then it is guaranteed not to move,
  1957 and the function returns the pointer originally passed in aCell. Note that the
  1958 length of the cell will be the same if the difference between the old size
  1959 and the new size is smaller than the minimum cell size.
  1960 
  1961 If the cell is being increased in size, i.e. aSize is bigger than its
  1962 current size, then the function tries to grow the cell in place.
  1963 If successful, then the function returns the pointer originally
  1964 passed in aCell. If unsuccessful, then:
  1965 -# if the cell cannot be moved, i.e. aMode has the ENeverMove bit set, then
  1966    the function returns NULL.
  1967 -# if the cell can be moved, i.e. aMode does not have the ENeverMove bit set,
  1968    then the function tries to allocate a new replacement cell, and, if
  1969    successful, returns a pointer to the new cell; if unsuccessful, it
  1970    returns NULL.
  1971 
  1972 Note that in debug mode, the function returns NULL if the cell cannot be grown
  1973 in place, regardless of whether the ENeverMove bit is set.
  1974 
  1975 If the reallocated cell is at a different location from the original cell, then
  1976 the content of the original cell is copied to the reallocated cell.
  1977 
  1978 If the supplied pointer, aCell is NULL, then the function attempts to allocate
  1979 a new cell, but only if the cell can be moved, i.e. aMode does not have
  1980 the ENeverMove bit set.
  1981 
  1982 Note the following general points:
  1983 - If reallocation fails, the content of the original cell is preserved.
  1984 - The resulting size of the re-allocated cell may be rounded up to a value
  1985   greater than aSize, but is guaranteed to be not less than aSize.
  1986  
  1987 @param aCell A pointer to the cell to be reallocated. This may be NULL.
  1988 
  1989 @param aSize The new size of the cell. This may be bigger or smaller than the
  1990              size of the original cell. The value can also be zero, but this is
  1991              interpreted as a request for a cell of minimum size; the net
  1992              effect is the same as if the caller had explicitly requested
  1993              a cell of minimum size.
  1994              Note that the minimum size of a heap cell is device dependent.
  1995              
  1996 @param aMode Flags controlling the reallocation. The only bit which has any
  1997              effect on this function is that defined by the enumeration
  1998              ENeverMove of the enum RAllocator::TReAllocMode.
  1999              If this is set, then any successful reallocation guarantees not
  2000              to have changed the start address of the cell.
  2001              By default, this parameter is zero.
  2002 
  2003 @return A pointer to the reallocated cell. This may be the same as the original
  2004         pointer supplied through aCell. NULL if there is insufficient memory to
  2005         reallocate the cell, or to grow it in place.
  2006 
  2007 @panic USER 42, if aCell is not NULL, and does not point to a valid cell.
  2008 @panic USER 47, if the maximum unsigned value of aSize is greater
  2009                 than or equal to KMaxTInt/2. For example,
  2010                 calling ReAlloc(someptr,-1) raises this panic.
  2011 
  2012 @see RAllocator::TReAllocMode
  2013 */
  2014 	{
  2015 
  2016 	return GetHeap()->ReAlloc(aCell, aSize, aMode);
  2017 	}
  2018 
  2019 
  2020 
  2021 
  2022 EXPORT_C TAny* User::ReAllocL(TAny* aCell, TInt aSize, TInt aMode)
  2023 /**
  2024 Increases or decreases the size of an existing cell, and leaves 
  2025 if there is insufficient memory in the current thread's default heap.
  2026 
  2027 If the cell is being decreased in size, then it is guaranteed not to move,
  2028 and the function returns the pointer originally passed in aCell. Note that the
  2029 length of the cell will be the same if the difference between the old size
  2030 and the new size is smaller than the minimum cell size.
  2031 
  2032 If the cell is being increased in size, i.e. aSize is bigger than its
  2033 current size, then the function tries to grow the cell in place.
  2034 If successful, then the function returns the pointer originally
  2035 passed in aCell. If unsuccessful, then:
  2036 -# if the cell cannot be moved, i.e. aMode has the ENeverMove bit set, then
  2037    the function leaves.
  2038 -# if the cell can be moved, i.e. aMode does not have the ENeverMove bit set,
  2039    then the function tries to allocate a new replacement cell, and, if
  2040    successful, returns a pointer to the new cell; if unsuccessful, it
  2041    leaves.
  2042 
  2043 Note that in debug mode, the function leaves if the cell cannot be grown
  2044 in place, regardless of whether the ENeverMove bit is set.
  2045 
  2046 If the reallocated cell is at a different location from the original cell, then
  2047 the content of the original cell is copied to the reallocated cell.
  2048 
  2049 If the supplied pointer, aCell is NULL, then the function attempts to allocate
  2050 a new cell, but only if the cell can be moved, i.e. aMode does not have
  2051 the ENeverMove bit set.
  2052 
  2053 Note the following general points:
  2054 - If reallocation fails, the content of the original cell is preserved.
  2055 - The resulting size of the re-allocated cell may be rounded up to a value
  2056   greater than aSize, but is guaranteed to be not less than aSize.
  2057 
  2058 @param aCell A pointer to the cell to be reallocated. This may be NULL.
  2059 
  2060 @param aSize The new size of the cell. This may be bigger or smaller than the
  2061              size of the original cell. The value can also be zero, but this is
  2062              interpreted as a request for a cell of minimum size; the net
  2063              effect is the same as if the caller had explicitly requested
  2064              a cell of minimum size.
  2065              Note that the minimum size of a heap cell is device dependent.
  2066              
  2067 @param aMode Flags controlling the reallocation. The only bit which has any
  2068              effect on this function is that defined by the enumeration
  2069              ENeverMove of the enum RAllocator::TReAllocMode.
  2070              If this is set, then any successful reallocation guarantees not
  2071              to have changed the start address of the cell.
  2072              By default, this parameter is zero.
  2073 
  2074 @return A pointer to the reallocated cell. This may be the same as the original
  2075         pointer supplied through aCell.
  2076 
  2077 @panic USER 42, if aCell is not NULL, and does not point to a valid cell.
  2078 @panic USER 47, if the maximum unsigned value of aSize is greater
  2079                 than or equal to KMaxTInt/2. For example,
  2080                 calling ReAlloc(someptr,-1) raises this panic.
  2081 
  2082 @see RAllocator::TReAllocMode
  2083 */
  2084 	{
  2085 
  2086 	return GetHeap()->ReAllocL(aCell, aSize, aMode);
  2087 	}
  2088 
  2089 
  2090 
  2091 
  2092 EXPORT_C RAllocator& User::Allocator()
  2093 /**
  2094 Gets the current thread's default current heap.
  2095 
  2096 @return The current heap.
  2097 */
  2098 	{
  2099 
  2100 	return *GetHeap();
  2101 	}		
  2102 
  2103 
  2104 
  2105 
  2106 EXPORT_C TInt User::AllocSize(TInt &aTotalAllocSize)
  2107 /**
  2108 Gets the total number of cells allocated on the current thread's default heap, 
  2109 and the total space allocated to them.
  2110 
  2111 @param aTotalAllocSize On return, contains the total space allocated to
  2112                        the cells.
  2113                        
  2114 @return The number of cells currently allocated on the current thread's heap.
  2115 */
  2116 	{
  2117 
  2118 	return(GetHeap()->AllocSize(aTotalAllocSize));
  2119 	}
  2120 
  2121 
  2122 
  2123 
  2124 EXPORT_C TInt User::CountAllocCells()
  2125 /**
  2126 Gets the total number of cells allocated on the current thread's default heap.
  2127 
  2128 
  2129 @return The number of cells allocated on the current thread's default user heap.
  2130 */
  2131 	{
  2132 	return(GetHeap()->Count());
  2133 	}  
  2134 
  2135 
  2136 
  2137 
  2138 EXPORT_C TInt User::CountAllocCells(TInt &aFreeCount)
  2139 /**
  2140 Gets the the total number of cells allocated, and the number of free cells, 
  2141 on the current thread's default heap.
  2142 
  2143 @param aFreeCount On return, contains the number of free cells 
  2144                   on the current thread's default heap.
  2145 
  2146 @return The number of cells allocated on the current thread's default heap.
  2147 */
  2148 	{
  2149 
  2150 	return(GetHeap()->Count(aFreeCount));
  2151 	}
  2152 
  2153 
  2154 
  2155 
  2156 EXPORT_C RAllocator* User::SwitchAllocator(RAllocator* aA)
  2157 /**
  2158 Changes the current thread's heap.
  2159 	
  2160 @param aA A pointer to the new heap handle.
  2161 
  2162 @return A pointer to the old heap handle.
  2163 */
  2164 	{
  2165 	
  2166 #ifdef __USERSIDE_THREAD_DATA__
  2167 	// Just cache the pointer user-side.  We still need to let the kernel know what's going on so
  2168 	// the heap can be cleaned up correctly later.
  2169 	LocalThreadData()->iHeap=aA;
  2170 #endif
  2171 	return Exec::HeapSwitch(aA);
  2172 	}
  2173 
  2174 // The suffix table
  2175 const TText16* const __DefaultDateSuffixTable[KMaxSuffixes] =
  2176 	{
  2177 	_S16("st"),_S16("nd"),_S16("rd"),_S16("th"),_S16("th"),
  2178 	_S16("th"),_S16("th"),_S16("th"),_S16("th"),_S16("th"),
  2179 	_S16("th"),_S16("th"),_S16("th"),_S16("th"),_S16("th"),
  2180 	_S16("th"),_S16("th"),_S16("th"),_S16("th"),_S16("th"),
  2181 	_S16("st"),_S16("nd"),_S16("rd"),_S16("th"),_S16("th"),
  2182 	_S16("th"),_S16("th"),_S16("th"),_S16("th"),_S16("th"),
  2183 	_S16("st")
  2184 	};
  2185 
  2186 // The day names
  2187 const TText16* const __DefaultDayTable[KMaxDays] =
  2188 	{
  2189 	_S16("Monday"),
  2190 	_S16("Tuesday"),
  2191 	_S16("Wednesday"),
  2192 	_S16("Thursday"),
  2193 	_S16("Friday"),
  2194 	_S16("Saturday"),
  2195 	_S16("Sunday")
  2196 	};
  2197 
  2198 // The abbreviated day names
  2199 const TText16* const __DefaultDayAbbTable[KMaxDays] =
  2200 	{
  2201 	_S16("Mon"),
  2202 	_S16("Tue"),
  2203 	_S16("Wed"),
  2204 	_S16("Thu"),
  2205 	_S16("Fri"),
  2206 	_S16("Sat"),
  2207 	_S16("Sun")
  2208 	};
  2209 
  2210 // The month names
  2211 const TText16* const __DefaultMonthTable[KMaxMonths] =
  2212 	{
  2213 	_S16("January"),
  2214 	_S16("February"),
  2215 	_S16("March"),
  2216 	_S16("April"),
  2217 	_S16("May"),
  2218 	_S16("June"),
  2219 	_S16("July"),
  2220 	_S16("August"),
  2221 	_S16("September"),
  2222 	_S16("October"),
  2223 	_S16("November"),
  2224 	_S16("December")
  2225 	};
  2226 
  2227 // The abbreviated month names
  2228 const TText16* const __DefaultMonthAbbTable[KMaxMonths] =
  2229 	{
  2230 	_S16("Jan"),
  2231 	_S16("Feb"),
  2232 	_S16("Mar"),
  2233 	_S16("Apr"),
  2234 	_S16("May"),
  2235 	_S16("Jun"),
  2236 	_S16("Jul"),
  2237 	_S16("Aug"),
  2238 	_S16("Sep"),
  2239 	_S16("Oct"),
  2240 	_S16("Nov"),
  2241 	_S16("Dec")
  2242 	};
  2243 
  2244 // The am/pm strings
  2245 const TText16* const __DefaultAmPmTable[KMaxAmPms] =
  2246 	{
  2247 	_S16("am"),
  2248 	_S16("pm")
  2249 	};
  2250 
  2251 const TText16* const __DefaultLMsgTable[ELocaleMessages_LastMsg] =
  2252 	{
  2253 // Fileserver
  2254 	_S16("Retry"),								// Button 1
  2255 	_S16("Stop"),									// Button 2
  2256 	_S16("Put the disk back"),					// Put the card back - line1
  2257 	_S16("or data will be lost"),					// Put the card back - line2
  2258 	_S16("Batteries too low"),					// Low power - line1
  2259 	_S16("Cannot complete write to disk"),		// Low power - line2
  2260 	_S16("Disk error - cannot complete write"),	// Disk error - line1
  2261 	_S16("Retry or data will be lost"),			// Disk error - line2
  2262 // SoundDriver
  2263 	_S16("Chimes"),								// Chimes
  2264 	_S16("Rings"),								// Rings
  2265 	_S16("Signal"),								// Signal
  2266 // MediaDriver diskname (max 16 chars)
  2267 	_S16("Internal"),								// Internal
  2268 	_S16("External(01)"),							// External(01)
  2269 	_S16("External(02)"),							// External(02)
  2270 	_S16("External(03)"),							// External(03)
  2271 	_S16("External(04)"),							// External(04)
  2272 	_S16("External(05)"),							// External(05)
  2273 	_S16("External(06)"),							// External(06)
  2274 	_S16("External(07)"),							// External(07)
  2275 	_S16("External(08)"),							// External(08)
  2276 // MediaDriver socketname (max 16 chars)
  2277 	_S16("Socket(01)"),							// Socket(01)
  2278 	_S16("Socket(02)"),							// Socket(02)
  2279 	_S16("Socket(03)"),							// Socket(03)
  2280 	_S16("Socket(04)")							// Socket(04)
  2281 	};
  2282 
  2283 LOCAL_C void LocaleLanguageGet(SLocaleLanguage& locale)
  2284 	{
  2285 	TPckg<SLocaleLanguage> localeLanguageBuf(locale);
  2286 	TInt r = RProperty::Get(KUidSystemCategory, KLocaleLanguageKey, localeLanguageBuf);
  2287 	__ASSERT_DEBUG(r == KErrNone || r == KErrNotFound, Panic(EBadLocaleParameter));
  2288 	if(r == KErrNotFound)
  2289 		{
  2290 		locale.iLanguage			= ELangEnglish;
  2291 		locale.iDateSuffixTable		= (const TText16*)__DefaultDateSuffixTable;
  2292 		locale.iDayTable			= (const TText16*)__DefaultDayTable;
  2293 		locale.iDayAbbTable			= (const TText16*)__DefaultDayAbbTable;
  2294 		locale.iMonthTable			= (const TText16*)__DefaultMonthTable;
  2295 		locale.iMonthAbbTable		= (const TText16*)__DefaultMonthAbbTable;
  2296 		locale.iAmPmTable			= (const TText16*)__DefaultAmPmTable;
  2297 		locale.iMsgTable			= (const TText16* const*)__DefaultLMsgTable;
  2298 		}
  2299 	}
  2300 
  2301 LOCAL_C void LocaleSettingsGet(SLocaleLocaleSettings& locale)
  2302 	{
  2303 	TPckg<SLocaleLocaleSettings> localeSettingsBuf(locale);
  2304 	TInt r = RProperty::Get(KUidSystemCategory, KLocaleDataExtraKey, localeSettingsBuf);
  2305 	__ASSERT_DEBUG(r == KErrNone || r == KErrNotFound, Panic(EBadLocaleParameter));
  2306 	if(r == KErrNotFound)
  2307 		{
  2308 		Mem::Copy(&locale.iCurrencySymbol[0], _S16("\x00a3"), sizeof(TText16) << 2);
  2309 		locale.iLocaleExtraSettingsDllPtr = NULL;
  2310 		}
  2311 	}
  2312 
  2313 LOCAL_C void LocaleTimeDateFormatGet(SLocaleTimeDateFormat& locale)
  2314 	{
  2315 	TPckg<SLocaleTimeDateFormat> localeTimeDateFormatBuf(locale);
  2316 	TInt r = RProperty::Get(KUidSystemCategory, KLocaleTimeDateFormatKey, localeTimeDateFormatBuf);
  2317 	__ASSERT_DEBUG(r == KErrNone || r == KErrNotFound, Panic(EBadLocaleParameter));
  2318 	if(r == KErrNotFound)
  2319 		{
  2320 		Mem::Copy(&locale.iShortDateFormatSpec[0], _S16("%F%*D/%*M/%Y"), sizeof(TText16) * 13);
  2321 		Mem::Copy(&locale.iLongDateFormatSpec[0], _S16("%F%*D%X %N %Y"), sizeof(TText16) * 14);
  2322 		Mem::Copy(&locale.iTimeFormatSpec[0], _S16("%F%*I:%T:%S %*A"), sizeof(TText16) * 16);
  2323 		locale.iLocaleTimeDateFormatDllPtr = NULL;
  2324 		}
  2325 	}
  2326 
  2327 EXPORT_C void TDayName::Set(TDay aDay)
  2328 /**
  2329 Re-retrieves the current locale's text for the specified day of the week.
  2330 
  2331 @param aDay Identifies the day of the week.
  2332 
  2333 @panic USER 184, if the specified day is outside the permitted range.
  2334 */
  2335 	{
  2336 	
  2337 	__ASSERT_ALWAYS(aDay>=EMonday && aDay<=ESunday,Panic(EBadLocaleParameter));
  2338 	SLocaleLanguage localeLanguage;
  2339 	LocaleLanguageGet(localeLanguage);
  2340 	Copy((reinterpret_cast<const TText* const*>(localeLanguage.iDayTable))[aDay]);
  2341 	}
  2342 
  2343 
  2344 
  2345 
  2346 EXPORT_C void TDayNameAbb::Set(TDay aDay)
  2347 /**
  2348 Re-retrieves the current locale's abbreviated text for the specified day of 
  2349 the week.
  2350 
  2351 @param aDay Identifies the day of the week.
  2352 
  2353 @panic USER 184, if the specified day is outside the permitted range.
  2354 */
  2355 	{
  2356 
  2357 	__ASSERT_ALWAYS(aDay>=EMonday && aDay<=ESunday,Panic(EBadLocaleParameter));
  2358 	SLocaleLanguage localeLanguage;
  2359 	LocaleLanguageGet(localeLanguage);
  2360 	Copy((reinterpret_cast<const TText* const*>(localeLanguage.iDayAbbTable))[aDay]);
  2361 	}
  2362 
  2363 
  2364 
  2365 
  2366 EXPORT_C void TMonthName::Set(TMonth aMonth)
  2367 /**
  2368 Re-retrieves the current locale's text for the specified month.
  2369 
  2370 @param aMonth Identifies the month.
  2371 
  2372 @panic USER 184, if the specified month is outside the permitted range.
  2373 */
  2374 	{
  2375 
  2376 	__ASSERT_ALWAYS(aMonth>=EJanuary && aMonth<=EDecember,Panic(EBadLocaleParameter));
  2377 	SLocaleLanguage localeLanguage;
  2378 	LocaleLanguageGet(localeLanguage);
  2379 	Copy((reinterpret_cast<const TText* const*>(localeLanguage.iMonthTable))[aMonth]);
  2380 	}
  2381 
  2382 
  2383 
  2384 
  2385 EXPORT_C void TMonthNameAbb::Set(TMonth aMonth)
  2386 /**
  2387 Re-retrieves the current locale's abbreviated text for the specified month.
  2388 
  2389 @param aMonth Identifies the month.
  2390 
  2391 @panic USER 184, if the specified month is outside the permitted range.
  2392 */
  2393 	{
  2394 
  2395 	__ASSERT_ALWAYS(aMonth>=EJanuary && aMonth<=EDecember,Panic(EBadLocaleParameter));
  2396 	SLocaleLanguage localeLanguage;
  2397 	LocaleLanguageGet(localeLanguage);
  2398 	Copy((reinterpret_cast<const TText* const*>(localeLanguage.iMonthAbbTable))[aMonth]);
  2399 	}
  2400 
  2401 
  2402 
  2403 
  2404 EXPORT_C void TDateSuffix::Set(TInt aSuffix)
  2405 /**
  2406 Re-retrieves the current locale's date suffix text for the specified day of 
  2407 the month.
  2408 
  2409 @param aSuffix A value identifying the day of the month. The value can 
  2410                range from 0 to 30 so that the first day of the month is
  2411                identified by 0, the second day by 1 etc.
  2412                    
  2413 @panic USER 69, if aDateSuffix is outside the range 0 to 30.
  2414 */
  2415 	{
  2416 
  2417 	__ASSERT_ALWAYS(aSuffix>=0 && aSuffix<KMaxSuffixes,Panic(ETLoclSuffixOutOfRange));
  2418 	SLocaleLanguage localeLanguage;
  2419 	LocaleLanguageGet(localeLanguage);
  2420 	Copy((reinterpret_cast<const TText* const*>(localeLanguage.iDateSuffixTable))[aSuffix]);
  2421 	}
  2422 
  2423 
  2424 
  2425 
  2426 EXPORT_C void TAmPmName::Set(TAmPm aSelector)
  2427 /**
  2428 Re-retrieves the current locale's text for identifying time before or after 
  2429 noon as identified by the specified selector.
  2430 
  2431 @param aSelector The am/pm selector.
  2432 
  2433 @panic USER 69, if aDateSuffix is outside the range 0 to 30.
  2434 */
  2435 	{
  2436 
  2437 	__ASSERT_ALWAYS(aSelector==EAm || aSelector==EPm,Panic(ETLoclSuffixOutOfRange));
  2438 	SLocaleLanguage localeLanguage;
  2439 	LocaleLanguageGet(localeLanguage);
  2440 	Copy((reinterpret_cast<const TText* const*>(localeLanguage.iAmPmTable))[aSelector]);
  2441 	}
  2442 
  2443 
  2444 
  2445 
  2446 EXPORT_C void TCurrencySymbol::Set()
  2447 /**
  2448 Re-retrieves the current locale's currency symbol(s).
  2449 */
  2450 	{
  2451 	SLocaleLocaleSettings locale;
  2452 	LocaleSettingsGet(locale);
  2453 	Copy(&locale.iCurrencySymbol[0]);
  2454 	}
  2455 
  2456 
  2457 
  2458 
  2459 EXPORT_C void TShortDateFormatSpec::Set()
  2460 /**
  2461 Sets the contents of the short date format specification from the system-wide 
  2462 settings.
  2463 */
  2464 	{
  2465 	SLocaleTimeDateFormat locale;
  2466 	LocaleTimeDateFormatGet(locale);
  2467 	Copy(&locale.iShortDateFormatSpec[0]);
  2468 	}
  2469 
  2470 
  2471 
  2472 
  2473 EXPORT_C void TLongDateFormatSpec::Set()
  2474 /**
  2475 Sets the contents of the long date format specification from the system-wide 
  2476 settings.
  2477 */
  2478 	{
  2479 	SLocaleTimeDateFormat locale;
  2480 	LocaleTimeDateFormatGet(locale);
  2481 	Copy(&locale.iLongDateFormatSpec[0]);
  2482 	}
  2483 
  2484 
  2485 
  2486 
  2487 EXPORT_C void TTimeFormatSpec::Set()
  2488 /**
  2489 Sets the contents of the time string format specification from the system-wide
  2490 settings.
  2491 */
  2492 	{
  2493 	SLocaleTimeDateFormat locale;
  2494 	LocaleTimeDateFormatGet(locale);
  2495 	Copy(&locale.iTimeFormatSpec[0]);
  2496 	}
  2497 
  2498 
  2499 
  2500 
  2501 EXPORT_C TInt User::SetCurrencySymbol(const TDesC& aSymbol)
  2502 /**
  2503 Sets the system wide currency symbol.
  2504 
  2505 On successful return from this function, a call to the Set() member function 
  2506 of a TCurrencySymbol object fetches the new currency symbol.
  2507 
  2508 @capability WriteDeviceData
  2509 
  2510 @param aSymbol A reference to the descriptor containing the currency symbol 
  2511                to be set.
  2512                
  2513 @return KErrNone if successful, otherwise one of the other system wide error codes.
  2514 
  2515 @panic USER 119, if the length of aSymbol is greater than KMaxCurrencySymbol. 
  2516 
  2517 @see TCurrencySymbol
  2518 @see TCurrencySymbol::Set()
  2519 @see KMaxCurrencySymbol
  2520 */
  2521 	{
  2522 
  2523 	TExtendedLocale locale;
  2524 	return locale.SetCurrencySymbol(aSymbol);
  2525 	}
  2526 
  2527 
  2528 
  2529 
  2530 EXPORT_C TLanguage User::Language()
  2531 /**
  2532 Gets the language of the current locale.
  2533 
  2534 @return One of the TLanguage enumerators identifying the language of the
  2535         current locale.
  2536 */
  2537 	{
  2538 
  2539 	SLocaleLanguage localeLanguage;
  2540 	LocaleLanguageGet(localeLanguage);
  2541 	return localeLanguage.iLanguage;
  2542 	}
  2543 
  2544 EXPORT_C TRegionCode User::RegionCode()
  2545 	{
  2546 #ifdef SYMBIAN_DISTINCT_LOCALE_MODEL
  2547 	TLocale locale;
  2548 	locale.Refresh();	
  2549 	return static_cast<TRegionCode>(locale.RegionCode());
  2550 #else
  2551 	return static_cast<TRegionCode>(0);
  2552 #endif
  2553 	}
  2554 
  2555 
  2556 EXPORT_C TLocale::TLocale()
  2557 /**
  2558 Default constructor.
  2559 
  2560 It constructs the object with the system's locale settings.
  2561 
  2562 A single copy of the locale information is maintained by the system. This 
  2563 copy may be refreshed under application control with TLocale::Refresh(), and 
  2564 the settings may be saved to the system with TLocale::Set(). However, the 
  2565 settings are never updated by the system apart from under application control. 
  2566 This enables applications to guarantee that consistent locale information 
  2567 is used.
  2568 
  2569 @see TLocale::Refresh()
  2570 @see TLocale::Set()
  2571 */
  2572 	{
  2573 
  2574 	Refresh();
  2575 	}
  2576 
  2577 
  2578 const TUint8 __DefaultDateSeparator[KMaxDateSeparators] = { 0, '/', '/', 0 };
  2579 const TUint8 __DefaultTimeSeparator[KMaxTimeSeparators] = { 0, ':', ':', 0 };
  2580 
  2581 void TLocale::SetDefaults()
  2582 	{
  2583 	iCountryCode = 44;
  2584 	iUniversalTimeOffset = 0;
  2585 	iDateFormat = EDateEuropean;
  2586 	iTimeFormat = ETime12;
  2587 	iCurrencySymbolPosition = ELocaleBefore;
  2588 	iCurrencySpaceBetween = EFalse;
  2589 	iCurrencyDecimalPlaces = 2;
  2590 	iNegativeCurrencyFormat = TNegativeCurrencyFormat(EFalse);
  2591 	iCurrencyTriadsAllowed = ETrue;
  2592 	iThousandsSeparator = ',';
  2593 	iDecimalSeparator = '.';
  2594 	TInt i=0;
  2595 	for(; i<KMaxDateSeparators; i++)
  2596 		iDateSeparator[i] = __DefaultDateSeparator[i];
  2597 	for(i=0; i<KMaxTimeSeparators; i++)
  2598 		iTimeSeparator[i] = __DefaultTimeSeparator[i];
  2599 	iAmPmSymbolPosition = ELocaleAfter;
  2600 	iAmPmSpaceBetween = ETrue;
  2601 	iHomeDaylightSavingZone = EDstEuropean;
  2602 	iWorkDays = 0x1f;
  2603 	iStartOfWeek = EMonday;
  2604 	iClockFormat = EClockAnalog;
  2605 	iUnitsGeneral = EUnitsImperial;
  2606 	iUnitsDistanceLong =  EUnitsImperial;
  2607 	iUnitsDistanceShort =  EUnitsImperial;
  2608 	iExtraNegativeCurrencyFormatFlags = 0;
  2609 	iLanguageDowngrade[0] = ELangNone;
  2610 	iLanguageDowngrade[1] = ELangNone;
  2611 	iLanguageDowngrade[2] = ELangNone;
  2612 #ifdef SYMBIAN_DISTINCT_LOCALE_MODEL
  2613 	iRegionCode = ERegGBR;
  2614 #else
  2615 	iRegionCode = 0;
  2616 #endif
  2617 	iDigitType = EDigitTypeWestern;
  2618 	iDeviceTimeState = TDeviceTimeState(EDeviceUserTime);
  2619 	}
  2620 
  2621 EXPORT_C void TLocale::Refresh()
  2622 /**
  2623 Refreshes the contents of this object with the system's locale settings.
  2624 */
  2625 	{
  2626 
  2627 	
  2628 	TPckg<TLocale> localeDataBuf(*this);
  2629 	TInt r = RProperty::Get(KUidSystemCategory, KLocaleDataKey, localeDataBuf);
  2630 	__ASSERT_DEBUG(r == KErrNone || r == KErrNotFound, Panic(EBadLocaleParameter));
  2631 	if(r == KErrNone)
  2632 		{
  2633 		iUniversalTimeOffset = Exec::UTCOffset();
  2634 		iDaylightSaving = 0;
  2635 		}
  2636 	else if(r == KErrNotFound)
  2637 			{
  2638 			SetDefaults();
  2639 			}
  2640 	}
  2641 
  2642 
  2643 
  2644 
  2645 EXPORT_C TInt TLocale::Set() const
  2646 /**
  2647 Transfers the locale settings from this object to the system. Note that
  2648 the timezone offset and daylight savings flags are ignored as setting these
  2649 through TLocale is no longer supported.
  2650 
  2651 After this function has been called, other applications may use the new
  2652 settings for newly-constructed TLocale objects,
  2653 or if they use TLocale::Refresh(), to refresh their settings from
  2654 the system copy.
  2655 
  2656 @capability WriteDeviceData
  2657 
  2658 @return KErrNone if successful, otherwise one of the other system wide error codes.
  2659 
  2660 @see TLocale::Refresh()
  2661 */
  2662 	{
  2663 	TPckg<TLocale> localeDataBuf(*this);
  2664 	TInt r = RProperty::Set(KUidSystemCategory, KLocaleDataKey, localeDataBuf);
  2665 	if(r == KErrNone)
  2666 		{
  2667 		Exec::NotifyChanges(EChangesLocale);
  2668 		}
  2669 	return r;
  2670 	}
  2671 
  2672 TInt TExtendedLocale::DoLoadLocale(const TDesC& aLocaleDllName, TLibraryFunction* aExportList)
  2673 	{
  2674 	RLoader loader;
  2675 	TInt r = loader.LoadLocale(aLocaleDllName, aExportList);
  2676 	return r;
  2677 	}
  2678 
  2679 #ifdef SYMBIAN_DISTINCT_LOCALE_MODEL
  2680 void TExtendedLocale::DoUpdateLanguageSettingsV2(TLibraryFunction* aExportList)
  2681 	{
  2682 	iLocale.iDigitType = EDigitTypeWestern;
  2683 	iLocale.iLanguageDowngrade[0] = ELangNone;
  2684 	iLocale.iLanguageDowngrade[1] = ELangNone;
  2685 	iLocale.iLanguageDowngrade[2] = ELangNone;
  2686 	
  2687 	iLanguageSettings.iLanguage = (TLanguage)aExportList[FnLanguageV2]();
  2688 	iLanguageSettings.iDateSuffixTable = (const TText*)aExportList[FnDateSuffixTableV2]();
  2689 	iLanguageSettings.iDayTable = (const TText*)aExportList[FnDayTableV2]();
  2690 	iLanguageSettings.iDayAbbTable = (const TText*)aExportList[FnDayAbbTableV2]();
  2691 	iLanguageSettings.iMonthTable = (const TText*)aExportList[FnMonthTableV2]();
  2692 	iLanguageSettings.iMonthAbbTable = (const TText*)aExportList[FnMonthAbbTableV2]();
  2693 	iLanguageSettings.iAmPmTable = (const TText*)aExportList[FnAmPmTableV2]();
  2694 	iLanguageSettings.iMsgTable = (const TText16* const*)aExportList[FnMsgTableV2]();
  2695 	
  2696 	TDigitType digitType = (TDigitType)aExportList[FnDigitTypeV2]();	
  2697 	iLocale.SetDigitType(digitType);
  2698 
  2699 	TLanguage* languageDowngrade = (TLanguage*)aExportList[FnLanguageDowngradeTableV2]();
  2700 	iLocale.SetLanguageDowngrade(0,*(languageDowngrade));
  2701 	iLocale.SetLanguageDowngrade(1,*(languageDowngrade+1));
  2702 	iLocale.SetLanguageDowngrade(2,*(languageDowngrade+2));
  2703 	}
  2704 
  2705 void TExtendedLocale::DoUpdateLocaleSettingsV2(TLibraryFunction* aExportList)
  2706 	{
  2707 	
  2708 	Mem::Copy(&iLocaleExtraSettings.iCurrencySymbol[0], (const TAny*)aExportList[FnCurrencySymbolV2](), sizeof(TText) * (KMaxCurrencySymbol+1));
  2709 	iLocaleExtraSettings.iLocaleExtraSettingsDllPtr = (TAny*)aExportList[FnCurrencySymbolV2]();
  2710 	Mem::Copy(&iLocaleTimeDateFormat.iShortDateFormatSpec[0], (const TAny*)aExportList[FnShortDateFormatSpecV2](), sizeof(TText) * (KMaxShortDateFormatSpec+1));
  2711 	Mem::Copy(&iLocaleTimeDateFormat.iLongDateFormatSpec[0], (const TAny*)aExportList[FnLongDateFormatSpecV2](), sizeof(TText) * (KMaxLongDateFormatSpec+1)) ;
  2712 	Mem::Copy(&iLocaleTimeDateFormat.iTimeFormatSpec[0], (const TAny*)aExportList[FnTimeFormatSpecV2](), sizeof(TText) * (KMaxTimeFormatSpec+1));
  2713 	iLocaleTimeDateFormat.iLocaleTimeDateFormatDllPtr = (TAny*)aExportList[FnCurrencySymbolV2]();
  2714 	
  2715 	iLocale.iExtraNegativeCurrencyFormatFlags=0x80000000;
  2716 	
  2717 	typedef void (*TLibFn)(TLocale*);
  2718 	((TLibFn)aExportList[FnLocaleDataV2])(&iLocale);
  2719 	
  2720 	if (iLocale.iExtraNegativeCurrencyFormatFlags&0x80000000)
  2721 		iLocale.iExtraNegativeCurrencyFormatFlags=0;		
  2722 	}
  2723 #endif
  2724 	
  2725 void TExtendedLocale::DoUpdateLanguageSettings(TLibraryFunction* aExportList)
  2726 	{
  2727 	iLanguageSettings.iLanguage = (TLanguage)aExportList[FnLanguage]();
  2728 	iLanguageSettings.iDateSuffixTable = (const TText*)aExportList[FnDateSuffixTable]();
  2729 	iLanguageSettings.iDayTable = (const TText*)aExportList[FnDayTable]();
  2730 	iLanguageSettings.iDayAbbTable = (const TText*)aExportList[FnDayAbbTable]();
  2731 	iLanguageSettings.iMonthTable = (const TText*)aExportList[FnMonthTable]();
  2732 	iLanguageSettings.iMonthAbbTable = (const TText*)aExportList[FnMonthAbbTable]();
  2733 	iLanguageSettings.iAmPmTable = (const TText*)aExportList[FnAmPmTable]();
  2734 	iLanguageSettings.iMsgTable = (const TText16* const*)aExportList[FnMsgTable]();
  2735 	}
  2736 
  2737 void TExtendedLocale::DoUpdateLocaleSettings(TLibraryFunction* aExportList)
  2738 	{
  2739 	Mem::Copy(&iLocaleExtraSettings.iCurrencySymbol[0], (const TAny*)aExportList[FnCurrencySymbol](), sizeof(TText) * (KMaxCurrencySymbol+1));
  2740 	iLocaleExtraSettings.iLocaleExtraSettingsDllPtr = (TAny*)aExportList[FnDateSuffixTable]();
  2741 	}
  2742 
  2743 void TExtendedLocale::DoUpdateTimeDateFormat(TLibraryFunction* aExportList)
  2744 	{
  2745 	Mem::Copy(&iLocaleTimeDateFormat.iShortDateFormatSpec[0], (const TAny*)aExportList[FnShortDateFormatSpec](), sizeof(TText) * (KMaxShortDateFormatSpec+1));
  2746 	Mem::Copy(&iLocaleTimeDateFormat.iLongDateFormatSpec[0], (const TAny*)aExportList[FnLongDateFormatSpec](), sizeof(TText) * (KMaxLongDateFormatSpec+1)) ;
  2747 	Mem::Copy(&iLocaleTimeDateFormat.iTimeFormatSpec[0], (const TAny*)aExportList[FnTimeFormatSpec](), sizeof(TText) * (KMaxTimeFormatSpec+1));
  2748 	iLocaleTimeDateFormat.iLocaleTimeDateFormatDllPtr = (TAny*)aExportList[FnDateSuffixTable]();
  2749 	}
  2750 
  2751 /**
  2752 Default constructor.
  2753 
  2754 It constructs an empty object
  2755 
  2756 This is an empty copy of TExtendedLocale. To get the system locale you can
  2757 use TExtendedLocale::LoadSystemSettings. The current settings may be saved to the system
  2758 with TLocale::SaveSystemSettings().
  2759 
  2760 @see TExtendedLocale::LoadSystemSettings
  2761 @see TExtendedLocale::SaveSystemSettings
  2762 */
  2763 EXPORT_C TExtendedLocale::TExtendedLocale()
  2764 	: iLocale(0)
  2765 	{
  2766 
  2767 	Mem::FillZ(&iLanguageSettings, sizeof(TExtendedLocale) - sizeof(TLocale));
  2768 	}
  2769 
  2770 /**
  2771 Load system wide locale settings
  2772 
  2773 It initialises this TExtendedLocale with the system wide locale settings.
  2774 The settings stored in the TExtendedLocale are overwritten with the system
  2775 wide locale.
  2776 
  2777 @see TExtendedLocale::SaveSystemSettings
  2778 */
  2779 EXPORT_C void TExtendedLocale::LoadSystemSettings()
  2780 	{
  2781 	LocaleLanguageGet(iLanguageSettings);
  2782 	LocaleSettingsGet(iLocaleExtraSettings);
  2783 	LocaleTimeDateFormatGet(iLocaleTimeDateFormat);
  2784 	iDefaultCharSet = GetLocaleCharSet();
  2785 	iPreferredCharSet = GetLocalePreferredCharSet();
  2786 	iLocale.Refresh();
  2787 	}
  2788 
  2789 /**
  2790 Make the current locale information system wide
  2791 
  2792 It overwrites the system wide locale information with the locale information
  2793 stored in this TExtendedLocale.
  2794 This will generate a notification for system locale changes.
  2795 In case of an error, the locale might be in an unconsistent state.
  2796 
  2797 @capability WriteDeviceData
  2798 
  2799 @return KErrNone if successful, otherwise one of the other system wide error codes.
  2800 */
  2801 EXPORT_C TInt TExtendedLocale::SaveSystemSettings()
  2802 	{
  2803 
  2804 	TPckg<SLocaleLanguage> localeLanguageBuf(iLanguageSettings);
  2805 	TInt r = RProperty::Set(KUidSystemCategory, KLocaleLanguageKey, localeLanguageBuf);
  2806 	if(r != KErrNone)
  2807 		return r;
  2808 
  2809 	TPckg<SLocaleLocaleSettings> localeSettingsBuf(iLocaleExtraSettings);
  2810 	r = RProperty::Set(KUidSystemCategory, KLocaleDataExtraKey, localeSettingsBuf);
  2811 	if(r != KErrNone)
  2812 		return r;
  2813 
  2814 	TPckg<SLocaleTimeDateFormat> localeTimeDateFormatBuf(iLocaleTimeDateFormat);
  2815 	r = RProperty::Set(KUidSystemCategory, KLocaleTimeDateFormatKey, localeTimeDateFormatBuf);
  2816 	if(r != KErrNone)
  2817 		return r;
  2818 
  2819 	r = Exec::SetGlobalUserData(ELocaleDefaultCharSet, (TInt)iDefaultCharSet);
  2820 	if(r != KErrNone)
  2821 		return r;
  2822 
  2823 	r = Exec::SetGlobalUserData(ELocalePreferredCharSet, (TInt)iPreferredCharSet);
  2824 
  2825 	if(r == KErrNone)
  2826 		{
  2827 		iLocale.Set();
  2828 		}
  2829 
  2830 	return r;
  2831 	}
  2832 
  2833 #ifdef SYMBIAN_DISTINCT_LOCALE_MODEL
  2834 TInt TExtendedLocale::CheckLocaleDllName(const TDesC& aLocaleDllName, TInt& languageID)
  2835 	{
  2836 	languageID = 0;
  2837 	
  2838 	if(aLocaleDllName.Find(KLoc) == KErrNotFound)
  2839 		return KErrNotFound;	
  2840 
  2841 	TInt len = aLocaleDllName.Length() - 6;  //6 is the length of KLoc.
  2842 	TPtrC ptr = aLocaleDllName.Right(len);
  2843 	for(TInt i =0; i< len; i++)
  2844 		{
  2845 		if(ptr[i] >= '0' && ptr[i] <= '9')
  2846 			{
  2847 			languageID = languageID*10 + (ptr[i] - '0');
  2848 			}
  2849 		else
  2850 			{
  2851 			languageID = 0;
  2852 			return KErrNotFound;
  2853 			}
  2854 		}
  2855 	return KErrNone;	
  2856 	}
  2857 
  2858 //add file extension, such as "elocl_lan" will be "elocl_lan.012"
  2859 void TExtendedLocale::AddExtension(TDes& aFileName, TInt aExtension)
  2860 	{			
  2861 	if (aExtension < 10)
  2862 		{
  2863 		aFileName.AppendNum(0);
  2864 		aFileName.AppendNum(0);
  2865 		aFileName.AppendNum(aExtension);
  2866 		}
  2867 	else if (aExtension < 100)
  2868 		{
  2869 		aFileName.AppendNum(0);
  2870 		aFileName.AppendNum(aExtension);
  2871 		}
  2872 	else
  2873 		{
  2874 		aFileName.AppendNum(aExtension);
  2875 		}	
  2876 	return;	
  2877 	}
  2878 #endif
  2879 	
  2880 /**
  2881 Loads a locale Dll and get the locale information
  2882 
  2883 It loads a locale DLL and it initialises the contents of this TExtendedLocale
  2884 with the locale information stored in the DLL. The locale information is only
  2885 stored in this TExtendedLocale. If you want to set the system wide settings with
  2886 the locale information in the DLL, you can call TExtendedLocale::SaveSystemSettings
  2887 after calling this function.
  2888 
  2889 @param aLocaleDllName The name of the locale DLL to be loaded
  2890 @return KErrNone if successful, system wide error if not
  2891 
  2892 @see TExtendedLocale::SaveSystemSettings 
  2893 */
  2894 EXPORT_C TInt TExtendedLocale::LoadLocale(const TDesC& aLocaleDllName)
  2895 	{
  2896 #ifdef SYMBIAN_DISTINCT_LOCALE_MODEL
  2897 	TLibraryFunction data[KNumLocaleExports];
  2898 	TInt r = DoLoadLocale(aLocaleDllName, &data[0]);
  2899 	if(r == KErrNone)
  2900 		{
  2901 		iLocale.iExtraNegativeCurrencyFormatFlags=0x80000000;
  2902 	  	iLocale.iLanguageDowngrade[0] = ELangNone;
  2903 		iLocale.iLanguageDowngrade[1] = ELangNone;
  2904   		iLocale.iLanguageDowngrade[2] = ELangNone;
  2905 	  	iLocale.iDigitType = EDigitTypeWestern;
  2906 
  2907 		typedef void (*TLibFn)(TLocale*);
  2908 		((TLibFn)data[FnLocaleData])(&iLocale);
  2909 
  2910 		//Locale daylightsavings unchanged - we have travelled through space, not time
  2911 		if (iLocale.iExtraNegativeCurrencyFormatFlags&0x80000000)
  2912 			iLocale.iExtraNegativeCurrencyFormatFlags=0;		
  2913 		
  2914 		DoUpdateLanguageSettings(&data[0]);
  2915 		DoUpdateLocaleSettings(&data[0]);
  2916 		DoUpdateTimeDateFormat(&data[0]);
  2917 
  2918 		iPreferredCharSet = (const LCharSet*)data[FnCharSet]();
  2919 		iDefaultCharSet = iPreferredCharSet;
  2920 		return r;
  2921 		}
  2922 	else if(r == KErrNotFound)
  2923 	    {
  2924 	    TInt lan = 0;
  2925 		TInt reg = 0;
  2926 		TInt col = 0;
  2927 	     TInt languageID = -1;
  2928 	     TInt err = CheckLocaleDllName(aLocaleDllName, languageID);
  2929 	     if (err != KErrNone)
  2930 	         return err;
  2931 	      
  2932 	     TInt i = 0;
  2933 	     while (i < KLocMapLength)  //binary search later
  2934 	         {
  2935 	         if ((LocaleMapping[i].iOldLocaleId) == languageID)
  2936 	             {
  2937 	             lan = LocaleMapping[i].iNewLocaleID[0];
  2938 	             reg = LocaleMapping[i].iNewLocaleID[1];
  2939 	             col = LocaleMapping[i].iNewLocaleID[2];
  2940 	             break;
  2941 	             }   
  2942 	         i++;
  2943 	         }
  2944 	     if(i == KLocMapLength)
  2945 	        return KErrNotFound;
  2946 	     
  2947 	     TBuf<15> lanptr = KFindLan();
  2948 	     TBuf<15> regptr = KFindReg();
  2949 	     TBuf<15> colptr = KFindCol();   
  2950 	     AddExtension(lanptr, lan);
  2951 	     AddExtension(regptr, reg);
  2952 	     AddExtension(colptr, col);  
  2953 	     err = LoadLocale(lanptr, regptr, colptr);   
  2954 	     
  2955 	     return err; 
  2956 	    }
  2957 	return r;
  2958 #else
  2959 	TLibraryFunction data[KNumLocaleExports];
  2960 	TInt r = DoLoadLocale(aLocaleDllName, &data[0]);
  2961 	if(r == KErrNone)
  2962 		{
  2963 		iLocale.iExtraNegativeCurrencyFormatFlags=0x80000000;
  2964 	  	iLocale.iLanguageDowngrade[0] = ELangNone;
  2965 		iLocale.iLanguageDowngrade[1] = ELangNone;
  2966   		iLocale.iLanguageDowngrade[2] = ELangNone;
  2967 	  	iLocale.iDigitType = EDigitTypeWestern;
  2968 
  2969 		typedef void (*TLibFn)(TLocale*);
  2970 		((TLibFn)data[FnLocaleData])(&iLocale);
  2971 
  2972 		//Locale daylightsavings unchanged - we have travelled through space, not time
  2973 		if (iLocale.iExtraNegativeCurrencyFormatFlags&0x80000000)
  2974 			iLocale.iExtraNegativeCurrencyFormatFlags=0;		
  2975 		
  2976 		DoUpdateLanguageSettings(&data[0]);
  2977 		DoUpdateLocaleSettings(&data[0]);
  2978 		DoUpdateTimeDateFormat(&data[0]);
  2979 
  2980 		iPreferredCharSet = (const LCharSet*)data[FnCharSet]();
  2981 		iDefaultCharSet = iPreferredCharSet;
  2982 		}
  2983 	return r;
  2984 #endif
  2985 	}
  2986 
  2987 /**
  2988 Loads locale data from three locale dlls, which are language, region, and collation locale dlls
  2989 
  2990 It loads three locale DLLs and it initialises the contents of this TExtendedLocale
  2991 with the locale information stored in the DLLs. The locale information is only
  2992 stored in this TExtendedLocale. If you want to set the system wide settings with
  2993 the locale information in the DLL, you can call TExtendedLocale::SaveSystemSettings
  2994 after calling this function.
  2995 
  2996 @param aLanguageLocaleDllName The name of the language locale DLL to be loaded
  2997 @param aRegionLocaleDllName The name of the region locale DLL to be loaded
  2998 @param aCollationLocaleDllName The name of the collation locale DLL to be loaded
  2999 
  3000 @return KErrNone if successful, system wide error if not
  3001 
  3002 @see TExtendedLocale::SaveSystemSettings 
  3003 */
  3004 #ifdef SYMBIAN_DISTINCT_LOCALE_MODEL
  3005 EXPORT_C TInt TExtendedLocale::LoadLocale(const TDesC& aLanguageLocaleDllName, 
  3006 		const TDesC& aRegionLocaleDllName, 
  3007 		const TDesC& aCollationLocaleDllName)
  3008 	{
  3009 
  3010 	TInt err = LoadLocaleAspect(aLanguageLocaleDllName);
  3011 	if(err != KErrNone)
  3012 		return err;
  3013 	
  3014 	err = LoadLocaleAspect(aRegionLocaleDllName);
  3015 	if(err != KErrNone)
  3016 		return err;
  3017 	
  3018 	err = LoadLocaleAspect(aCollationLocaleDllName);
  3019 	if(err != KErrNone)
  3020 		return err;	
  3021 
  3022 	return err;	
  3023 	}
  3024 #else
  3025 EXPORT_C TInt TExtendedLocale::LoadLocale(const TDesC& /*aLanguageLocaleDllName*/, 
  3026         const TDesC& /*aRegionLocaleDllName*/, 
  3027         const TDesC& /*aCollationLocaleDllName*/)
  3028     {
  3029     return KErrNotSupported;
  3030     }
  3031 #endif
  3032 
  3033 /**
  3034 Loads a DLL and get some locale information
  3035 
  3036 It loads the specified locale DLL and depending on the aAspectGroup it overwrites
  3037 locale information in this TExtendedLocale with the locale information stored in the
  3038 DLL. aAspectGroup is a bitmap of TLocaleAspect values specifying what to be overwritten.
  3039 The locale information is only stored in this TExtendedLocale. If you want to set the
  3040 system wide settings with the locale information in the DLL, you can call
  3041 TExtendedLocale::SaveSystemSettings after calling this function.
  3042 
  3043 @param aAspectGroup A bitmap of TLocaleAspect values specifying what to be overwritten in
  3044 					this TExtendedLocale. (eg.: ELocaleLanguageSettings | ELocaleTimeDateSettings)
  3045 @param aLocaleDllName The name of the locale DLL to be loaded
  3046 
  3047 @return KErrNone if the method is successful, a system wide error code if not
  3048 
  3049 @see TLocaleAspect
  3050 @see TExtendedLocale::SaveSystemSettings
  3051 */
  3052 EXPORT_C TInt TExtendedLocale::LoadLocaleAspect(TUint aAspectGroup, const TDesC& aLocaleDllName)
  3053 	{
  3054 #ifdef SYMBIAN_DISTINCT_LOCALE_MODEL
  3055 	TLibraryFunction data[KNumLocaleExports];
  3056 	TInt r = DoLoadLocale(aLocaleDllName, &data[0]);
  3057 	if(r == KErrNone)
  3058 		{
  3059 		if(aAspectGroup & ELocaleLanguageSettings)
  3060 			{
  3061 			DoUpdateLanguageSettings(&data[0]);
  3062 			}
  3063 		if(aAspectGroup & ELocaleCollateSetting)
  3064 			{
  3065 			iPreferredCharSet = (const LCharSet*)data[FnCharSet]();
  3066 			iDefaultCharSet = iPreferredCharSet;
  3067 			}
  3068 		if(aAspectGroup & ELocaleLocaleSettings)
  3069 			{
  3070 			DoUpdateLocaleSettings(&data[0]);
  3071 			}
  3072 		if(aAspectGroup & ELocaleTimeDateSettings)
  3073 			{
  3074 			DoUpdateTimeDateFormat(&data[0]);
  3075 			}
  3076 		return r;
  3077 		}
  3078 	
  3079 	else if (r == KErrNotFound)
  3080 	    {
  3081 	    TInt lan = 0;
  3082 		TInt reg = 0;
  3083 		TInt col = 0;
  3084 	    TInt languageID = -1;
  3085 	    TInt err = CheckLocaleDllName(aLocaleDllName, languageID);
  3086 	    if(err != KErrNone)
  3087 	        return err;
  3088 	    
  3089 	    TInt i = 0;
  3090 	    while (i < KLocMapLength)
  3091 	        {
  3092 	        if ((LocaleMapping[i].iOldLocaleId) == languageID)
  3093 	            {
  3094 	            lan = LocaleMapping[i].iNewLocaleID[0];
  3095 	            reg = LocaleMapping[i].iNewLocaleID[1];
  3096 	            col = LocaleMapping[i].iNewLocaleID[2];
  3097 	            break;
  3098 	            }   
  3099 	        i++;
  3100 	        }
  3101 	    if(i == KLocMapLength)
  3102 	        return KErrNotFound;
  3103 	    
  3104 	    TBuf<15> lanptr = KFindLan();
  3105 	    TBuf<15> regptr = KFindReg();
  3106 	    TBuf<15> colptr = KFindCol();   
  3107 	    AddExtension(lanptr, lan);
  3108 	    AddExtension(regptr, reg);
  3109 	    AddExtension(colptr, col);  
  3110 	    
  3111 	    switch (aAspectGroup)
  3112 	        {
  3113 	        case ELocaleCollateSetting:
  3114 	            {
  3115 	            err = LoadLocaleAspect(colptr);
  3116 	            break;          
  3117 	            }
  3118 	        case ELocaleLocaleSettings:
  3119 	            {
  3120 	            err = LoadLocaleAspect(regptr);
  3121 	            break;
  3122 	            }
  3123 	            
  3124 	        case ELocaleLanguageSettings:
  3125 	            {
  3126 	            err = LoadLocaleAspect(lanptr);
  3127 	            break;
  3128 	            }       
  3129 	        }
  3130 	    return err;
  3131 	    }
  3132 	
  3133 	return r;
  3134 #else
  3135 	TLibraryFunction data[KNumLocaleExports];
  3136 	TInt r = DoLoadLocale(aLocaleDllName, &data[0]);
  3137 	if(r == KErrNone)
  3138 		{
  3139 		if(aAspectGroup & ELocaleLanguageSettings)
  3140 			{
  3141 			DoUpdateLanguageSettings(&data[0]);
  3142 			}
  3143 		if(aAspectGroup & ELocaleCollateSetting)
  3144 			{
  3145 			iPreferredCharSet = (const LCharSet*)data[FnCharSet]();
  3146 			iDefaultCharSet = iPreferredCharSet;
  3147 			}
  3148 		if(aAspectGroup & ELocaleLocaleSettings)
  3149 			{
  3150 			DoUpdateLocaleSettings(&data[0]);
  3151 			}
  3152 		if(aAspectGroup & ELocaleTimeDateSettings)
  3153 			{
  3154 			DoUpdateTimeDateFormat(&data[0]);
  3155 			}
  3156 		}
  3157 	return r;
  3158 #endif
  3159 	}
  3160 
  3161 /**
  3162 Loads a DLL and get some locale information
  3163 
  3164 It loads the specified locale DLL, and it overwrites
  3165 locale information in this TExtendedLocale with the locale information stored in the
  3166 DLL. The locale information is only stored in this TExtendedLocale. If you want to set the
  3167 system wide settings with the locale information in the DLL, you can call
  3168 TExtendedLocale::SaveSystemSettings after calling this function.
  3169 
  3170 @param aLocaleDllName The name of the locale DLL to be loaded
  3171 
  3172 @return KErrNone if the method is successful, a system wide error code if not
  3173 
  3174 @see TExtendedLocale::SaveSystemSettings
  3175 */
  3176 #ifdef SYMBIAN_DISTINCT_LOCALE_MODEL
  3177 EXPORT_C TInt TExtendedLocale::LoadLocaleAspect(const TDesC& aLocaleDllName)
  3178 	{
  3179 	TLibraryFunction data[KNumLocaleExports];
  3180 	
  3181 	TInt result = aLocaleDllName.Find(KFindReg);
  3182 	if(result != KErrNotFound)
  3183 		{
  3184 		result = DoLoadLocale(aLocaleDllName, &data[0]);
  3185 		if(result == KErrNone)
  3186 			{
  3187 			DoUpdateLocaleSettingsV2(&data[0]);
  3188 			return result;
  3189 			}
  3190 		}
  3191 	
  3192 	result= aLocaleDllName.Find(KFindLan);
  3193 	if(result != KErrNotFound)
  3194 		{
  3195 		result = DoLoadLocale(aLocaleDllName, &data[0]);
  3196 		if(result == KErrNone)
  3197 			{
  3198 			DoUpdateLanguageSettingsV2(&data[0]);	
  3199 			return result;
  3200 			}
  3201 		}
  3202 	
  3203 	result = aLocaleDllName.Find(KFindCol);
  3204 	if(result != KErrNotFound)
  3205 		{
  3206 		result = DoLoadLocale(aLocaleDllName, &data[0]);
  3207 		if(result == KErrNone)
  3208 			{
  3209 			iPreferredCharSet = (const LCharSet*)data[1]();
  3210 			iDefaultCharSet = iPreferredCharSet;
  3211 			return result;
  3212 			}
  3213 		}
  3214 	
  3215 	return KErrNotFound;	
  3216 	}
  3217 #else
  3218 EXPORT_C TInt TExtendedLocale::LoadLocaleAspect(const TDesC& /*aLocaleDllName*/)
  3219     {
  3220     return KErrNotSupported;    
  3221     }	
  3222 #endif
  3223 
  3224 /**
  3225 Sets the currency symbol
  3226 
  3227 It sets the currency symbol. The maximum lenght for the currency symbol is
  3228 KMaxCurrencySymbol. Trying to pass a descriptor longer than that, will result
  3229 in a panic.
  3230 
  3231 @param aSymbol The new currency symbol
  3232 
  3233 @panic USER 119, if the length of aSymbol is greater than KMaxCurrencySymbol.
  3234 
  3235 @capability WriteDeviceData
  3236 
  3237 @return KErrNone if successful, otherwise one of the other system wide error codes.
  3238 */
  3239 EXPORT_C TInt TExtendedLocale::SetCurrencySymbol(const TDesC &aSymbol)
  3240 	{
  3241 	__ASSERT_ALWAYS(aSymbol.Length()<=KMaxCurrencySymbol,::Panic(ECurrencySymbolOverflow));
  3242 	
  3243 	LocaleSettingsGet(iLocaleExtraSettings);
  3244 	Mem::Copy(&iLocaleExtraSettings.iCurrencySymbol[0], aSymbol.Ptr(), aSymbol.Length()*sizeof(TText) );    
  3245 	iLocaleExtraSettings.iCurrencySymbol[aSymbol.Length()] = 0;
  3246 	TInt r = RProperty::Set(KUidSystemCategory, KLocaleDataExtraKey, TPckg<SLocaleLocaleSettings>(iLocaleExtraSettings));
  3247 	return r;
  3248 	}
  3249 
  3250 /**
  3251 Returns the name of the DLL containing the given bits of locale information
  3252 
  3253 Given the bits of locale information specified in aLocaleDataSet, it returns the name
  3254 of the locale DLL storing the information. TExtendedLocale can contain information from
  3255 different DLLs.
  3256 
  3257 @param aLocaleDataSet The TLocaleAspect specifying a group of locale properties
  3258 @param aDllName The descriptor that will contain the name of DLL containing the specifying
  3259 				bits of locale information (valid if the method is successful)
  3260 
  3261 @return KErrNone if successful, system wide error otherwise
  3262 */
  3263 EXPORT_C TInt TExtendedLocale::GetLocaleDllName(TLocaleAspect aLocaleDataSet, TDes& aDllName)
  3264 	{
  3265  	TBuf8<KMaxFullName> buf;
  3266 	TAny* ptr = 0;
  3267 	switch(aLocaleDataSet)
  3268 		{
  3269 		case ELocaleLanguageSettings:
  3270 			ptr = (TAny*)iLanguageSettings.iDateSuffixTable;
  3271 			break;
  3272 		case ELocaleCollateSetting:
  3273 			ptr = (TAny*)iPreferredCharSet;
  3274 			break;
  3275 		case ELocaleLocaleSettings:
  3276 			ptr = (TAny*)iLocaleExtraSettings.iLocaleExtraSettingsDllPtr;
  3277 			break;
  3278 		case ELocaleTimeDateSettings:
  3279 			ptr = (TAny*)iLocaleTimeDateFormat.iLocaleTimeDateFormatDllPtr;
  3280 			break;
  3281 		}
  3282  	TInt r = Exec::GetModuleNameFromAddress(ptr, buf);
  3283  	if (r == KErrNone)
  3284 		{
  3285  		aDllName.Copy(buf);
  3286  		}
  3287  	return r;
  3288 	}
  3289 
  3290 /**
  3291 Get the Currency Symbol from SLocaleLocaleSettings object
  3292 
  3293 @return TPtrC Pointer holding the Currency Symbol
  3294 */
  3295 EXPORT_C TPtrC TExtendedLocale::GetCurrencySymbol()
  3296 	{
  3297 	TPtrC outCurrencySymbolPtr(iLocaleExtraSettings.iCurrencySymbol);
  3298 	return outCurrencySymbolPtr;
  3299 	}
  3300 	
  3301 /**
  3302 Get the Long Date Format from SLocaleTimeDateFormat object
  3303 
  3304 @return TPtrC Pointer holding the Long Date Format
  3305 */
  3306 EXPORT_C TPtrC TExtendedLocale::GetLongDateFormatSpec()
  3307 	{
  3308 	TPtrC outLongDateFormatPtr(iLocaleTimeDateFormat.iLongDateFormatSpec);
  3309 	return outLongDateFormatPtr;
  3310 	}
  3311 	
  3312 /**
  3313 Get the Short Date Format from SLocaleTimeDateFormat object
  3314 
  3315 @return TPtrC Pointer holding the Short Date Format
  3316 */
  3317 EXPORT_C TPtrC TExtendedLocale::GetShortDateFormatSpec()
  3318 	{
  3319 	TPtrC outShortDateFormatPtr(iLocaleTimeDateFormat.iShortDateFormatSpec);
  3320 	return outShortDateFormatPtr;
  3321 	}
  3322 	
  3323 /**
  3324 Get the Time Format from SLocaleTimeDateFormat object
  3325 
  3326 @return TPtrC Pointer holding the Time Format
  3327 */
  3328 EXPORT_C TPtrC TExtendedLocale::GetTimeFormatSpec()
  3329 	{
  3330 	TPtrC outTimeFormatPtr(iLocaleTimeDateFormat.iTimeFormatSpec);
  3331 	return outTimeFormatPtr;
  3332 	}
  3333 
  3334 EXPORT_C TInt UserSvr::LocalePropertiesSetDefaults()
  3335 	{
  3336 	_LIT_SECURITY_POLICY_C1(KLocaleWritePolicy,ECapabilityWriteDeviceData);
  3337 	_LIT_SECURITY_POLICY_PASS(KLocaleReadPolicy);
  3338 
  3339 	TInt r = RProperty::Define(KUidSystemCategory, KLocaleLanguageKey, RProperty::EByteArray, KLocaleReadPolicy, KLocaleWritePolicy, sizeof(TPckg<SLocaleLanguage>));
  3340 	if(r != KErrNone && r != KErrAlreadyExists)
  3341 		return r;
  3342 	
  3343 	SLocaleLanguage localeLanguage;
  3344 	localeLanguage.iLanguage			= ELangEnglish;
  3345 	localeLanguage.iDateSuffixTable		= (const TText16*)__DefaultDateSuffixTable;
  3346 	localeLanguage.iDayTable			= (const TText16*)__DefaultDayTable;
  3347 	localeLanguage.iDayAbbTable			= (const TText16*)__DefaultDayAbbTable;
  3348 	localeLanguage.iMonthTable			= (const TText16*)__DefaultMonthTable;
  3349 	localeLanguage.iMonthAbbTable		= (const TText16*)__DefaultMonthAbbTable;
  3350 	localeLanguage.iAmPmTable			= (const TText16*)__DefaultAmPmTable;
  3351 	localeLanguage.iMsgTable			= (const TText16* const*)__DefaultLMsgTable;
  3352 	r = RProperty::Set(KUidSystemCategory, KLocaleLanguageKey, TPckg<SLocaleLanguage>(localeLanguage));
  3353 	if(r != KErrNone)
  3354 		return r;
  3355 
  3356 	r = RProperty::Define(KUidSystemCategory, KLocaleDataKey, RProperty::EByteArray, KLocaleReadPolicy, KLocaleWritePolicy, sizeof(TPckg<TLocale>));
  3357 	if(r != KErrNone && r != KErrAlreadyExists)
  3358 		return r;
  3359 
  3360 	TLocale locale(0);
  3361 	locale.SetDefaults();
  3362 
  3363 	r = RProperty::Set(KUidSystemCategory, KLocaleDataKey, TPckg<TLocale>(locale));
  3364 	if(r != KErrNone)
  3365 		return r;
  3366 
  3367 	r = RProperty::Define(KUidSystemCategory, KLocaleDataExtraKey, RProperty::EByteArray, KLocaleReadPolicy, KLocaleWritePolicy, sizeof(TPckg<SLocaleLocaleSettings>));
  3368 	if(r != KErrNone && r != KErrAlreadyExists)
  3369 		return r;
  3370 
  3371 	SLocaleLocaleSettings localeSettings;
  3372 	Mem::Copy(&localeSettings.iCurrencySymbol[0], _S16("\x00a3"), sizeof(TText16) * 2);
  3373 
  3374 	r = RProperty::Set(KUidSystemCategory, KLocaleDataExtraKey, TPckg<SLocaleLocaleSettings>(localeSettings));
  3375 	if(r != KErrNone)
  3376 		return r;
  3377 
  3378 	r = RProperty::Define(KUidSystemCategory, KLocaleTimeDateFormatKey, RProperty::EByteArray, KLocaleReadPolicy, KLocaleWritePolicy, sizeof(TPckg<SLocaleLocaleSettings>));
  3379 	if(r != KErrNone && r != KErrAlreadyExists)
  3380 		return r;
  3381 
  3382 	SLocaleTimeDateFormat localeTimeDateFormat;
  3383 	Mem::Copy(&localeTimeDateFormat.iShortDateFormatSpec[0], _S16("%F%*D/%*M/%Y"), sizeof(TText16) * 13);
  3384 	Mem::Copy(&localeTimeDateFormat.iLongDateFormatSpec[0], _S16("%F%*D%X %N %Y"), sizeof(TText16) * 14);
  3385 	Mem::Copy(&localeTimeDateFormat.iTimeFormatSpec[0], _S16("%F%*I:%T:%S %*A"), sizeof(TText16) * 16);
  3386 
  3387 	r = RProperty::Set(KUidSystemCategory, KLocaleTimeDateFormatKey, TPckg<SLocaleTimeDateFormat>(localeTimeDateFormat));
  3388 	if(r != KErrNone)
  3389 		return r;
  3390 
  3391 	TInt charSet = (TInt)GetLocaleDefaultCharSet();
  3392 	r = Exec::SetGlobalUserData(ELocaleDefaultCharSet, charSet);
  3393 	if(r != KErrNone)
  3394 		return r;
  3395 
  3396 	r = Exec::SetGlobalUserData(ELocalePreferredCharSet, charSet);
  3397 
  3398 	return r;
  3399 	}
  3400 
  3401 
  3402 // TOverflowHandler class created to handle the descriptor overflow in TLoacle::FormatCurrency
  3403 NONSHARABLE_CLASS(TOverflowHandler) : public TDesOverflow
  3404 	{
  3405 	void Overflow(TDes& aDes);
  3406 	};
  3407 
  3408 void TOverflowHandler::Overflow(TDes&)
  3409 	{
  3410 	Panic(ETDes16Overflow);
  3411 	}
  3412 
  3413 
  3414 
  3415 
  3416 EXPORT_C void TLocale::FormatCurrency(TDes& aText, TInt aAmount)
  3417 /**
  3418 Renders a currency value as text, based on the locale's currency and numeric 
  3419 format settings. 
  3420 
  3421 These settings include the currency symbol, the symbol's position and the 
  3422 way negative values are formatted.
  3423 
  3424 @param aText   On return, contains the currency value as text, formatted
  3425                according to the locale's currency format settings.
  3426 @param aAmount The currency value to be formatted.
  3427 
  3428 @panic USER 11, if aText is not long enough to hold the formatted value.
  3429 */
  3430 	{
  3431 	TOverflowHandler overflowHandler;
  3432 	FormatCurrency(aText,overflowHandler,aAmount);   
  3433 	}
  3434 
  3435 
  3436 
  3437 
  3438 EXPORT_C void TLocale::FormatCurrency(TDes& aText, TInt64 aAmount)
  3439 /**
  3440 Renders a currency value as text, based on the locale's currency and numeric 
  3441 format settings. 
  3442 
  3443 These settings include the currency symbol, the symbol's position and the 
  3444 way negative values are formatted.
  3445 
  3446 @param aText   On return, contains the currency value as text, formatted
  3447                according to the locale's currency format settings.
  3448 @param aAmount The currency value to be formatted.
  3449 
  3450 @panic USER 11, if aText is not long enough to hold the formatted value.
  3451 */
  3452 	{
  3453 	TOverflowHandler overflowHandler;
  3454 	FormatCurrency(aText,overflowHandler, aAmount);
  3455 	}
  3456 
  3457 
  3458 
  3459 
  3460 EXPORT_C void TLocale::FormatCurrency(TDes& aText, TDesOverflow& aOverflowHandler, TInt aAmount)
  3461 /**
  3462 Renders a currency value as text, based on the locale's currency and numeric 
  3463 format settings. 
  3464 
  3465 These settings include the currency symbol, the symbol's position and the 
  3466 way negative values are formatted. If aText is not long enough to hold the 
  3467 formatted currency value, the overflow handler's Overflow() function is called.
  3468 
  3469 @param aText            On return, contains the currency value as text,
  3470                         formatted according to the locale's currency format
  3471                         settings.
  3472 @param aOverflowHandler An object derived from TDesOverflow which handles
  3473                         descriptor overflows.
  3474 @param aAmount          The currency value to be formatted.
  3475 */
  3476 	{
  3477 	TInt64 aLongerInt(aAmount);
  3478 	FormatCurrency(aText, aOverflowHandler, aLongerInt); 
  3479 	}
  3480 
  3481 
  3482 
  3483 
  3484 EXPORT_C void TLocale::FormatCurrency(TDes& aText, TDesOverflow& aOverflowHandler, TInt64 aAmount)
  3485 /**
  3486 Renders a currency value as text, based on the locale's currency and numeric 
  3487 format settings. 
  3488 
  3489 These settings include the currency symbol, the symbol's position and the 
  3490 way negative values are formatted. If aText is not long enough to hold the 
  3491 formatted currency value, the overflow handler's Overflow() function is called.
  3492 
  3493 @param aText            On return, contains the currency value as text,
  3494                         formatted according to the locale's currency format
  3495                         settings.
  3496 @param aOverflowHandler An object derived from TDesOverflow which handles
  3497                         descriptor  overflows.
  3498 @param aAmount          The currency value to be formatted.
  3499 */
  3500 	{
  3501 	// aAmount is in cents (or equivalent) rather than dollars (or equivalent)
  3502 	const TBool amountIsNegative=(aAmount<0);
  3503 	if (amountIsNegative)
  3504 		{
  3505 		aAmount=-aAmount;
  3506 		}
  3507 	aText.Num(aAmount, EDecimal);
  3508 	const TInt currencyDecimalPlaces=CurrencyDecimalPlaces();
  3509 	TInt positionOfDecimalSeparator=aText.Length();
  3510 	if (currencyDecimalPlaces>0)
  3511 		{
  3512 		while (positionOfDecimalSeparator <= currencyDecimalPlaces)
  3513 			{
  3514 			if (aText.Length() == aText.MaxLength())
  3515 				{
  3516 				aOverflowHandler.Overflow(aText);
  3517 				return;
  3518 				}
  3519 			aText.Insert(0,KLitZeroPad);
  3520 			++positionOfDecimalSeparator;
  3521 			}
  3522 		positionOfDecimalSeparator=aText.Length();
  3523 		positionOfDecimalSeparator-=currencyDecimalPlaces;
  3524 		TBuf<1> decimalSeparator;
  3525 		decimalSeparator.Append(DecimalSeparator());
  3526 		if (aText.Length() == aText.MaxLength())
  3527 			{
  3528 			aOverflowHandler.Overflow(aText);
  3529 			return;
  3530 			}
  3531 		aText.Insert(positionOfDecimalSeparator, decimalSeparator);
  3532 		}
  3533 	if (CurrencyTriadsAllowed())
  3534 		{
  3535 		TBuf<1> thousandsSeparator;
  3536 		thousandsSeparator.Append(ThousandsSeparator());
  3537 		TInt numberOfThousandsSeparator = positionOfDecimalSeparator/3;
  3538 		if ((aText.Length()+numberOfThousandsSeparator) > aText.MaxLength())
  3539 			{
  3540 			aOverflowHandler.Overflow(aText);
  3541 			return;
  3542 			}
  3543 		for (TInt i=positionOfDecimalSeparator-3; i>0; i-=3)
  3544 			{
  3545 			aText.Insert(i, thousandsSeparator);
  3546 			}
  3547 		}
  3548 	TInt positionToInsertCurrencySymbol = 0; 
  3549 	switch (CurrencySymbolPosition())
  3550 		{
  3551 		case ELocaleBefore:
  3552 			{
  3553 			if ((amountIsNegative) && (NegativeCurrencySymbolOpposite()))
  3554 				{
  3555 				positionToInsertCurrencySymbol=aText.Length();
  3556 				}
  3557 			else
  3558 				positionToInsertCurrencySymbol=0;
  3559 			}
  3560 			break;
  3561 		case ELocaleAfter:
  3562 			{
  3563 			if ((amountIsNegative) && (NegativeCurrencySymbolOpposite()))
  3564 				{
  3565 				positionToInsertCurrencySymbol=0;
  3566 				}
  3567 			else
  3568 				positionToInsertCurrencySymbol=aText.Length();
  3569 			}
  3570 			break;
  3571 		default:
  3572 			Panic(ETRegionOutOfRange);
  3573 			break;
  3574 		}
  3575 	if (CurrencySpaceBetween())
  3576 		{
  3577 		if (aText.Length() == aText.MaxLength())
  3578 			{
  3579 			aOverflowHandler.Overflow(aText);
  3580 			return;
  3581 			}
  3582 		if ((amountIsNegative) && (NegativeLoseSpace()))
  3583 			{
  3584 			// don't add the space
  3585 			}
  3586 		else
  3587 			{
  3588 			aText.Insert(positionToInsertCurrencySymbol, KLitSpace); 
  3589 			if (positionToInsertCurrencySymbol>0)
  3590 				{
  3591 				++positionToInsertCurrencySymbol;
  3592 				}
  3593 			}
  3594 		}
  3595 	TCurrencySymbol theCurrencySymbol;
  3596 	if ((aText.Length()+theCurrencySymbol.Length()) > aText.MaxLength())
  3597 		{
  3598 		aOverflowHandler.Overflow(aText);
  3599 		return;
  3600 		}
  3601 	aText.Insert(positionToInsertCurrencySymbol,theCurrencySymbol);
  3602 	if (amountIsNegative)
  3603 		{
  3604 		TInt positionToInsertInterveningMinusSign = 0;
  3605 		if ((CurrencySpaceBetween()) && !(NegativeLoseSpace()))
  3606 			{
  3607 			if (positionToInsertCurrencySymbol>0)
  3608 				{
  3609 				positionToInsertInterveningMinusSign = positionToInsertCurrencySymbol-1;
  3610 				}
  3611 			else
  3612 				{
  3613 				positionToInsertInterveningMinusSign = theCurrencySymbol.Length()+1;
  3614 				}
  3615 			}
  3616 		else
  3617 			{
  3618 			if (positionToInsertCurrencySymbol>0)
  3619 				{
  3620 				positionToInsertInterveningMinusSign = positionToInsertCurrencySymbol;
  3621 				}
  3622 			else
  3623 				{
  3624 				positionToInsertInterveningMinusSign = theCurrencySymbol.Length();
  3625 				}
  3626 			}
  3627 		switch (NegativeCurrencyFormat())
  3628 			{
  3629 			case EInBrackets:
  3630 				{
  3631 				if ((aText.Length()+2) > aText.MaxLength())
  3632 					{
  3633 					aOverflowHandler.Overflow(aText);
  3634 					return;
  3635 					}
  3636 				aText.Insert(0, KLitOpeningBracket);
  3637 				aText.Append(')');
  3638 				}
  3639 				break;
  3640 			case ELeadingMinusSign:
  3641 				{
  3642 				if (aText.Length() == aText.MaxLength())
  3643 					{
  3644 					aOverflowHandler.Overflow(aText);
  3645 					return;
  3646 					}
  3647 				aText.Insert(0, KLitMinusSign);
  3648 				}
  3649 				break;
  3650 			case ETrailingMinusSign:
  3651 				{
  3652 				if (aText.Length() == aText.MaxLength())
  3653 					{
  3654 					aOverflowHandler.Overflow(aText);
  3655 					return;
  3656 					}
  3657 				aText.Append(KLitMinusSign);
  3658 				}
  3659 				break;
  3660 			case EInterveningMinusSign:
  3661 				{
  3662 				if (aText.Length() == aText.MaxLength())
  3663 					{
  3664 					aOverflowHandler.Overflow(aText);
  3665 					return;
  3666 					}
  3667 				aText.Insert(positionToInsertInterveningMinusSign, KLitMinusSign);
  3668 				}
  3669 				break;
  3670 			default:
  3671 				Panic(ETRegionOutOfRange);
  3672 				break;
  3673 			}
  3674 		}
  3675 	}
  3676 	
  3677 
  3678 EXPORT_C void TLocaleMessageText::Set(TLocaleMessage aMsgNo)
  3679 //
  3680 // Get some text from Locale
  3681 //
  3682 	{
  3683 	if(TUint(aMsgNo) < ELocaleMessages_LastMsg)
  3684 		{
  3685 		SLocaleLanguage localeLanguage;
  3686 		LocaleLanguageGet(localeLanguage);
  3687 		Copy((reinterpret_cast<const TText* const*>(localeLanguage.iMsgTable))[aMsgNo]);
  3688 		}
  3689 	else
  3690 		SetLength(0);
  3691 	}
  3692 
  3693 
  3694 
  3695 
  3696 EXPORT_C TInt TFindServer::Next(TFullName &aResult)
  3697 /**
  3698 Gets the full name of the next server which matches the match pattern.
  3699 
  3700 @param aResult A reference to a descriptor with a defined maximum length.
  3701                If a matching server is found, its full name is set into
  3702                this descriptor. If no matching server is found,
  3703                the descriptor length is set to zero.
  3704                
  3705 @return KErrNone if a matching server is found, KErrNotFound otherwise.
  3706 */
  3707 	{
  3708 	return NextObject(aResult,EServer);
  3709 	}
  3710 
  3711 
  3712 
  3713 
  3714 EXPORT_C void RServer2::Receive(RMessage2& aMessage, TRequestStatus &aStatus)
  3715 //
  3716 // Receive a message from the server asynchronously.
  3717 //
  3718 	{
  3719 
  3720 	aStatus=KRequestPending;
  3721 	Exec::ServerReceive(iHandle, aStatus, &aMessage);
  3722 	}
  3723 
  3724 EXPORT_C void RServer2::Cancel()
  3725 //
  3726 // Cancel a pending message receive.
  3727 //
  3728 	{
  3729 
  3730 	Exec::ServerCancel(iHandle);
  3731 	}
  3732 
  3733 
  3734 
  3735 
  3736 EXPORT_C TInt TFindMutex::Next(TFullName &aResult)
  3737 /**
  3738 Finds the next global mutex whose full name matches the match pattern.
  3739 
  3740 If a global mutex with a matching name is found, the function copies its full 
  3741 name into the specified descriptor. It also saves the find-handle associated 
  3742 with the global mutex into the TFindHandleBase part of this object.
  3743 
  3744 @param aResult A reference to a descriptor with a defined maximum length. 
  3745                If a matching global mutex is found, its full name is set
  3746                into this descriptor. 
  3747                If no matching global mutex is found, the descriptor length
  3748                is set to zero.
  3749                
  3750 @return KErrNone if a matching global mutex is found;
  3751         KErrNotFound otherwise.
  3752 */
  3753 	{
  3754 	return NextObject(aResult,EMutex);
  3755 	}
  3756 
  3757 
  3758 
  3759 
  3760 /**
  3761 Acquire the mutex, waiting for it to become free if necessary.
  3762 
  3763 This function checks if the mutex is currently held. If not the mutex is marked
  3764 as held by the current thread and the call returns immediately. If the mutex is
  3765 held by another thread the current thread will suspend until the mutex becomes
  3766 free. If the mutex is already held by the current thread a count is maintained
  3767 of how many times the thread has acquired the mutex.
  3768 */
  3769 EXPORT_C void RMutex::Wait()
  3770 	{
  3771 
  3772 	Exec::MutexWait(iHandle);
  3773 	}
  3774 
  3775 
  3776 
  3777 
  3778 /**
  3779 Release the mutex.
  3780 
  3781 This function decrements the count of how many times the current thread has
  3782 acquired this mutex. If the count is now zero the mutex is marked as free and,
  3783 if any other threads are waiting for the mutex to become free, the highest
  3784 priority among those is made ready to run. However the mutex is not marked as
  3785 held by any thread - the thread which has just been awakened must actually run
  3786 in order to acquire the mutex.
  3787 
  3788 @pre The mutex must previously have been acquired by the current thread calling
  3789 Wait().
  3790 
  3791 @panic KERN-EXEC 1 If the mutex has not previously been acquired by the current
  3792 thread calling Wait().
  3793 */
  3794 EXPORT_C void RMutex::Signal()
  3795 	{
  3796 
  3797 	Exec::MutexSignal(iHandle);
  3798 	}
  3799 
  3800 
  3801 
  3802 /**
  3803 Test if this mutex is held by the current thread.
  3804 @return True if the current thread has waited on the mutex, false otherwise.
  3805 */
  3806 EXPORT_C TBool RMutex::IsHeld()
  3807 	{
  3808 	return Exec::MutexIsHeld(iHandle);
  3809 	}
  3810 
  3811 
  3812 /** Wait on a condition variable
  3813 
  3814 This call releases the specified mutex then atomically blocks the current
  3815 thread on this condition variable. The atomicity here is with respect to the
  3816 condition variable and mutex concerned. Specifically if the condition variable
  3817 is signalled at any time after the mutex is released then this thread will be
  3818 awakened. Once the thread has awakened it will reacquire the specified mutex
  3819 before this call returns (except in the case where the condition variable has
  3820 been deleted).
  3821 
  3822 The usage pattern for this is as follows:
  3823 
  3824 @code
  3825 	mutex.Wait();
  3826 	while(!CONDITION)
  3827 		condvar.Wait(mutex);
  3828 	STATEMENTS;
  3829 	mutex.Signal();
  3830 @endcode
  3831 
  3832 where CONDITION is an arbitrary condition involving any number of user-side
  3833 variables whose integrity is protected by the mutex.
  3834 
  3835 It is necessary to loop while testing the condition because there is **no** guarantee
  3836 that the condition has been satisfied when the condition variable is signalled.
  3837 Different threads may be waiting on different conditions or the condition may
  3838 have already been absorbed by another thread. All that can be said is that the
  3839 thread will awaken whenever something happens which **might** affect the condition.
  3840 
  3841 It needs to be stressed that if:
  3842 
  3843 @code
  3844 condvar.Wait(mutex);
  3845 @endcode
  3846 
  3847 completes, it does not necessarily mean that the condition is yet satisfied, hence the necessity for the loop.
  3848 
  3849 @param	aMutex		The mutex to be released and reacquired.
  3850 @return	KErrNone	if the condition variable has been signalled.
  3851 		KErrInUse	if another thread is already waiting on this condition
  3852 					variable in conjunction with a different mutex.
  3853 		KErrGeneral	if the condition variable is deleted.
  3854 
  3855 @pre	The specified mutex is held by the current thread.
  3856 @post	The specified mutex is held by the current thread unless the return
  3857 		value is KErrGeneral in which case the condition variable no longer
  3858 		exists.
  3859 
  3860 @panic	KERN-EXEC 0 if either the condition variable or mutex handles are not
  3861 		valid.
  3862 @panic	KERN-EXEC 54 if the current thread does not hold the specified mutex.
  3863 
  3864 @see	RCondVar::Signal()
  3865 @see	RCondVar::Broadcast()
  3866 */
  3867 EXPORT_C TInt RCondVar::Wait(RMutex& aMutex)
  3868 	{
  3869 	return Exec::CondVarWait(iHandle, aMutex.Handle(), 0);
  3870 	}
  3871 
  3872 
  3873 
  3874 /** Wait on a condition variable with timeout
  3875 
  3876 This is the same as RCondVar::Wait(RMutex) except that there is a time limit on
  3877 how long the current thread will block while waiting for the condition variable.
  3878 
  3879 @param	aMutex		The mutex to be released and reacquired.
  3880 @param	aTimeout	The maximum time to wait in microseconds.
  3881 					0 means no maximum.
  3882 @return	KErrNone	if the condition variable has been signalled.
  3883 		KErrInUse	if another thread is already waiting on this condition
  3884 					variable in conjunction with a different mutex.
  3885 		KErrGeneral	if the condition variable is deleted.
  3886 		KErrTimedOut if the timeout expired before the condition variable was
  3887 					signalled.
  3888 
  3889 @pre	The specified mutex is held by the current thread.
  3890 @post	The specified mutex is held by the current thread unless the return
  3891 		value is KErrGeneral in which case the condition variable no longer
  3892 		exists.
  3893 
  3894 @panic	KERN-EXEC 0 if either the condition variable or mutex handles are not
  3895 		valid.
  3896 @panic	KERN-EXEC 54 if the current thread does not hold the specified mutex.
  3897 
  3898 @see	RCondVar::Wait(RMutex)
  3899 */
  3900 EXPORT_C TInt RCondVar::TimedWait(RMutex& aMutex, TInt aTimeout)
  3901 	{
  3902 	return Exec::CondVarWait(iHandle, aMutex.Handle(), aTimeout);
  3903 	}
  3904 
  3905 
  3906 /** Signal a condition variable
  3907 
  3908 This unblocks a single thread which is currently blocked on the condition
  3909 variable. The highest priority waiting thread which is not explicitly suspended
  3910 will be the one unblocked. If there are no threads currently waiting this call
  3911 does nothing.
  3912 
  3913 It is not required that any mutex is held when calling this function but it is
  3914 recommended that the mutex associated with the condition variable is held since
  3915 otherwise a race condition can result from the condition variable being signalled
  3916 just after the waiting thread testing the condition and before it calls Wait().
  3917 
  3918 */
  3919 EXPORT_C void RCondVar::Signal()
  3920 	{
  3921 	Exec::CondVarSignal(iHandle);
  3922 	}
  3923 
  3924 
  3925 
  3926 /** Broadcast to a condition variable
  3927 
  3928 This unblocks all threads which are currently blocked on the condition
  3929 variable. If there are no threads currently waiting this call does nothing.
  3930 
  3931 It is not required that any mutex is held when calling this function but it is
  3932 recommended that the mutex associated with the condition variable is held since
  3933 otherwise a race condition can result from the condition variable being signalled
  3934 just after the waiting thread testing the condition and before it calls Wait().
  3935 
  3936 */
  3937 EXPORT_C void RCondVar::Broadcast()
  3938 	{
  3939 	Exec::CondVarBroadcast(iHandle);
  3940 	}
  3941 
  3942 
  3943 
  3944 
  3945 EXPORT_C TInt TFindProcess::Next(TFullName &aResult)
  3946 /**
  3947 Gets the full name of the next process which matches the match pattern.
  3948 
  3949 @param aResult A reference to a TBuf descriptor with a defined maximum length.
  3950                If a matching process is found, its full name is set into
  3951                this descriptor. If no matching process is found, the descriptor
  3952                length is set to zero.
  3953 
  3954 @return KErrNone if successful, otherwise one of the other  system-wide error
  3955         codes.
  3956 */
  3957 	{
  3958 	return NextObject(aResult,EProcess);
  3959 	}
  3960 
  3961 
  3962 
  3963 
  3964 EXPORT_C TUidType RProcess::Type() const
  3965 /**
  3966 Gets the Uid type associated with the process. 
  3967 
  3968 @return A reference to a TUidType object containing the process type.
  3969 */
  3970 	{
  3971 
  3972 	TUidType u;
  3973 	Exec::ProcessType(iHandle,u);
  3974 	return(u);
  3975 	}
  3976 
  3977 
  3978 
  3979 
  3980 EXPORT_C TProcessId RProcess::Id() const
  3981 /**
  3982 Gets the Id of this process.
  3983 
  3984 @return The Id of this process.
  3985 */
  3986 	{
  3987 
  3988 	return TProcessId( (TUint)Exec::ProcessId(iHandle) );
  3989 	}
  3990 
  3991 
  3992 
  3993 
  3994 EXPORT_C void RProcess::Resume()
  3995 /**
  3996 Makes the first thread in the process eligible for execution.
  3997 
  3998 @panic KERN-EXEC 32 if the process is not yet fully loaded.
  3999 
  4000 @see RThread::Resume()
  4001 */
  4002 	{
  4003 
  4004 	Exec::ProcessResume(iHandle);
  4005 	}
  4006 
  4007 
  4008 
  4009 EXPORT_C TFileName RProcess::FileName() const
  4010 /**
  4011 Gets a copy of the full path name of the loaded executable on which this 
  4012 process is based.
  4013 
  4014 This is the file name which is passed to the Create() member function of this 
  4015 RProcess.
  4016 
  4017 @return A TBuf descriptor with a defined maximum length containing the full 
  4018         path name of the file.
  4019         
  4020 @see RProcess::Create()
  4021 */
  4022 	{
  4023 
  4024 	TFileName n;
  4025 	TPtr8 n8(((TUint8*)n.Ptr()) + KMaxFileName, KMaxFileName);
  4026 	Exec::ProcessFileName(iHandle,n8);
  4027 	n.Copy(n8);
  4028 	return(n);
  4029 	}
  4030 
  4031 
  4032 
  4033 
  4034 EXPORT_C void User::CommandLine(TDes &aCommand)
  4035 /**
  4036 Gets a copy of the data which is passed as an argument to the thread function
  4037 of the current process's main thread when it is first scheduled to run.
  4038 
  4039 @param aCommand A modifiable descriptor supplied by the caller into which the
  4040                 argument data is put. The descriptor must be big enough to
  4041                 contain the expected data, otherwise the function raises
  4042                 a panic.
  4043 
  4044 @see User::CommandLineLength()
  4045 */
  4046 	{
  4047 	TPtr8 aCommand8((TUint8*)aCommand.Ptr(),aCommand.MaxLength()<<1);
  4048 	Exec::ProcessCommandLine(KCurrentProcessHandle,aCommand8);
  4049 	aCommand.SetLength(aCommand8.Length()>>1);
  4050 	}
  4051 
  4052 
  4053 
  4054 
  4055 EXPORT_C TInt User::CommandLineLength()
  4056 /**
  4057 Gets the length of the data which is passed as an argument to the thread
  4058 function of the current process's main thread when it is first scheduled
  4059 to run.
  4060 
  4061 @return The length of the argument data.
  4062 */
  4063 	{
  4064 	return Exec::ProcessCommandLineLength(KCurrentProcessHandle);
  4065 	}
  4066 
  4067 
  4068 
  4069 
  4070 EXPORT_C TExitType RProcess::ExitType() const
  4071 /**
  4072 Tests whether the process has ended and, if it has ended, return how it ended.
  4073 
  4074 This information allows the caller to distinguish between normal termination 
  4075 and a panic.
  4076 
  4077 @return An enumeration whose enumerators describe how the process has ended.
  4078 */
  4079 	{
  4080 
  4081 	return(Exec::ProcessExitType(iHandle));
  4082 	}
  4083 
  4084 
  4085 
  4086 
  4087 EXPORT_C TInt RProcess::ExitReason() const
  4088 /** 
  4089 Gets the specific reason associated with the end of this process.
  4090 
  4091 The reason number together with the category name is a way of distinguishing
  4092 between different causes of process termination.
  4093 
  4094 If the process has panicked, this value is the panic number. If the process 
  4095 has ended as a result of a call to Kill(), then the value is the one supplied 
  4096 by Kill().
  4097 
  4098 If the process has not ended, then the returned value is zero.
  4099 
  4100 @return The reason associated with the end of the process.
  4101 
  4102 @see RProcess::Kill()
  4103 */
  4104 	{
  4105 
  4106 	return(Exec::ProcessExitReason(iHandle));
  4107 	}
  4108 
  4109 
  4110 
  4111 
  4112 EXPORT_C TExitCategoryName RProcess::ExitCategory() const
  4113 /**
  4114 Gets the name of the category associated with the end of the process.
  4115 
  4116 The category name together with the reason number is a way of distinguishing
  4117 between different causes of process termination.
  4118 
  4119 If the process has panicked, the category name is the panic category name; 
  4120 for example, E32USER-CBase or KERN-EXEC. If the process has ended as a result 
  4121 of a call to Kill(), then the category name is Kill.
  4122 
  4123 If the process has not ended, then the category name is empty, i.e. the length 
  4124 of the category name is zero.
  4125 
  4126 @return A descriptor with a defined maximum length containing the 
  4127         name of the category associated with the end of the process.
  4128         
  4129 @see RProcess::Kill()
  4130 */
  4131 	{
  4132 
  4133 	TExitCategoryName n;
  4134 	TPtr8 n8(((TUint8*)n.Ptr()) + KMaxExitCategoryName, KMaxExitCategoryName);
  4135 	Exec::ProcessExitCategory(iHandle,n8);
  4136 	n.Copy(n8);
  4137 	return(n);
  4138 	}
  4139 
  4140 
  4141 
  4142 
  4143 EXPORT_C TProcessPriority RProcess::Priority() const
  4144 /**
  4145 Gets the priority of this process.
  4146 
  4147 @return One of the TProcessPriority enumerator values.
  4148 */
  4149 	{
  4150 
  4151 	return(Exec::ProcessPriority(iHandle));
  4152 	}
  4153 
  4154 
  4155 
  4156 
  4157 EXPORT_C TInt RProcess::SetPriority(TProcessPriority aPriority) const
  4158 /**
  4159 Sets the priority of this process to one of the values defined by theTProcessPriority 
  4160 enumeration. The priority can be set to one of the four values:
  4161 
  4162 EPriorityLow
  4163 
  4164 EPriorityBackground
  4165 
  4166 EPriorityForeground
  4167 
  4168 EPriorityHigh
  4169 
  4170 The absolute priority of all threads owned by the process (and all threads 
  4171 owned by those threads etc.) are re-calculated.
  4172 
  4173 Notes:
  4174 
  4175 The priority values EPriorityWindowServer, EPriorityFileServer, EPriorityRealTimeServer 
  4176 and EPrioritySupervisor are internal to Symbian OS and any attempt to explicitly 
  4177 set any of these priority values causes a KERN-EXEC 14 panic to be raised.
  4178 
  4179 Any attempt to set the priority of a process which is protected and is different 
  4180 from the process owning the thread which invokes this function, causes a KERN-EXEC 
  4181 1 panic to be raised.
  4182 
  4183 A process can set its own priority whether it is protected or not.
  4184 
  4185 @param aPriority The priority value.
  4186 
  4187 @return KErrNone, if successful; otherwise one of the other system-wide
  4188         error codes.
  4189 
  4190 */
  4191 	{
  4192 
  4193 	return Exec::ProcessSetPriority(iHandle,aPriority);
  4194 	}
  4195 
  4196 
  4197 
  4198 
  4199 /**
  4200 Tests whether "Just In Time" debugging is enabled or not for this process.
  4201 
  4202 @return True, when "Just In Time" debugging is enabled. False otherwise.
  4203 @see RProcess::SetJustInTime
  4204 */
  4205 
  4206 EXPORT_C TBool RProcess::JustInTime() const
  4207 	{
  4208 
  4209 	return (Exec::ProcessFlags(iHandle) & KProcessFlagJustInTime) != 0;
  4210 	}
  4211 
  4212 
  4213 /**
  4214 Enables or disables "Just In Time" debugging for this process.
  4215 This will only have an effect when running on the emulator.
  4216 
  4217 "Just In Time" debugging catches a thread just before it executes a panic
  4218 or exception routine.  Capturing a thread early, before it is terminated, 
  4219 allows the developer to more closely inspect what went wrong, before the 
  4220 kernel removes the thread.  In some cases, the developer can modify context,
  4221 program counter, and variables to recover the thread.  This is only possible
  4222 on the emulator.
  4223 
  4224 By default, "Just In Time" debugging is enabled.
  4225 
  4226 @param aBoolean ETrue, to enable just-in-time debugging.
  4227 				EFalse, to disable just-in-time debugging.
  4228 */
  4229 EXPORT_C void RProcess::SetJustInTime(TBool aState) const
  4230 	{
  4231 
  4232 	TUint32 set = aState ? KProcessFlagJustInTime : 0;
  4233 	Exec::ProcessSetFlags(iHandle, KProcessFlagJustInTime, set);
  4234 	}
  4235 
  4236 
  4237 
  4238 
  4239 EXPORT_C TInt RProcess::SecureApi(TInt /*aState*/)
  4240 	{
  4241 	return ESecureApiOn;
  4242 	}
  4243 
  4244 EXPORT_C TInt RProcess::DataCaging(TInt /*aState*/)
  4245 	{
  4246 	return EDataCagingOn;
  4247 	}
  4248 
  4249 
  4250 
  4251 EXPORT_C TInt RProcess::GetMemoryInfo(TModuleMemoryInfo& aInfo) const
  4252 /**
  4253 Gets the size and base address of the code and various data
  4254 sections of the process.
  4255 
  4256 The run addresses are also returned.
  4257 
  4258 @param aInfo On successful return, contains the base address and size of the 
  4259              sections.
  4260              
  4261 @return KErrNone, if successful; otherwise one of the other system wide error 
  4262         codes.
  4263 */
  4264 	{
  4265 
  4266 	return Exec::ProcessGetMemoryInfo(iHandle,aInfo);
  4267 	}
  4268 	
  4269 
  4270 EXPORT_C TAny* RProcess::ExeExportData(void)
  4271 /**
  4272 Retrieves pointer to named symbol export data from the current process, i.e. the
  4273 process calling this function.
  4274              
  4275 @return Pointer to export data when it is present, NULL if export data not found
  4276 @internalTechnology
  4277 @released
  4278 */
  4279 	{
  4280 
  4281 	return Exec::ProcessExeExportData();
  4282 	}
  4283 
  4284 
  4285 
  4286 EXPORT_C TInt TFindSemaphore::Next(TFullName &aResult)
  4287 /**
  4288 Finds the next global semaphore whose full name matches the match pattern.
  4289 
  4290 If a global semaphore with a matching name is found, the function copies its 
  4291 full name into the descriptor aResult. It also saves the find-handle associated 
  4292 with the global semaphore into the TFindHandleBase part of this TFindSemaphore 
  4293 object.
  4294 
  4295 @param aResult A reference to a TBuf descriptor with a defined maximum length. 
  4296                If a matching global semaphore is found, its full name is set
  4297                into this descriptor. 
  4298                If no matching global semaphore is found, the descriptor length
  4299                is set to zero. 
  4300                
  4301 @return KErrNone if a matching global semaphore is found;
  4302         KErrNotFound otherwise.
  4303 */
  4304 	{
  4305 	return NextObject(aResult,ESemaphore);
  4306 	}
  4307 
  4308 
  4309 
  4310 
  4311 EXPORT_C void RSemaphore::Wait()
  4312 /**
  4313 Waits for a signal on the semaphore.
  4314 
  4315 The function decrements the semaphore count by one and returns immediately 
  4316 if it is zero or positive.
  4317 
  4318 If the semaphore count is negative after being decremented, the calling thread is 
  4319 added to a queue of threads maintained by this semaphore.
  4320 
  4321 The thread waits until the semaphore is signalled. More than one thread can 
  4322 be waiting on a particular semaphore at a time. When there are multiple threads 
  4323 waiting on a semaphore, they are released in priority order.
  4324 
  4325 If the semaphore is deleted, all threads waiting on that semaphore are released.
  4326 */
  4327 	{
  4328 
  4329 	Exec::SemaphoreWait(iHandle, 0);
  4330 	}
  4331 
  4332 
  4333 
  4334 
  4335 EXPORT_C TInt RSemaphore::Wait(TInt aTimeout)
  4336 /**
  4337 Waits for a signal on the semaphore, or a timeout.
  4338 
  4339 @param aTimeout The timeout value in micoseconds
  4340 
  4341 @return KErrNone if the wait has completed normally.
  4342         KErrTimedOut if the timeout has expired.
  4343         KErrGeneral if the semaphore is being reset, i.e the semaphore
  4344         is about to  be deleted.
  4345         KErrArgument if aTimeout is negative;
  4346         otherwise one of the other system wide error codes.
  4347 */
  4348 	{
  4349 
  4350 	return Exec::SemaphoreWait(iHandle, aTimeout);
  4351 	}
  4352 
  4353 
  4354 
  4355 
  4356 EXPORT_C void RSemaphore::Signal()
  4357 /**
  4358 Signals the semaphore once.
  4359 
  4360 The function increments the semaphore count by one. If the count was negative 
  4361 before being incremented, the highest priority thread waiting on the semaphore's queue 
  4362 of threads is removed from that queue and, provided that it is not suspended 
  4363 for any other reason, is marked as ready to run.
  4364 */
  4365 	{
  4366 
  4367 	Exec::SemaphoreSignal1(iHandle);
  4368 	}
  4369 
  4370 
  4371 
  4372 
  4373 EXPORT_C void RSemaphore::Signal(TInt aCount)
  4374 /**
  4375 Signals the semaphore one or more times.
  4376 
  4377 The function increments the semaphore count. If the count was negative 
  4378 before being incremented, the highest priority thread waiting on the semaphore's queue 
  4379 of threads is removed from that queue and, provided that it is not suspended 
  4380 for any other reason, is marked as ready to run.
  4381 
  4382 @param aCount The number of times the semaphore is to be signalled.
  4383 */
  4384 	{
  4385 
  4386 	__ASSERT_ALWAYS(aCount>=0,Panic(ESemSignalCountNegative));
  4387 	Exec::SemaphoreSignalN(iHandle,aCount);
  4388 	}
  4389 
  4390 
  4391 
  4392 
  4393 EXPORT_C RCriticalSection::RCriticalSection()
  4394 	: iBlocked(1)
  4395 /**
  4396 Default constructor.
  4397 */
  4398 	{}
  4399 
  4400 
  4401 
  4402 
  4403 EXPORT_C void RCriticalSection::Close()
  4404 /**
  4405 Closes the handle to the critical section.
  4406 
  4407 As a critical section object is implemented using a semaphore, this has the 
  4408 effect of closing the handle to the semaphore.
  4409 */
  4410 	{
  4411 
  4412 	RSemaphore::Close();
  4413 	}
  4414 
  4415 
  4416 
  4417 
  4418 EXPORT_C void RCriticalSection::Wait()
  4419 /**
  4420 Waits for the critical section to become free.
  4421 
  4422 If no other thread is in the critical section, control returns immediately 
  4423 and the current thread can continue into the section.
  4424 
  4425 If another thread is already in the critical section, the current thread is 
  4426 marked as waiting (on a semaphore); the current thread is added to a queue
  4427 of threads maintained by this critical section.
  4428 */
  4429 	{
  4430 
  4431 	if (__e32_atomic_add_acq32(&iBlocked, KMaxTUint32) != 1)
  4432 		RSemaphore::Wait();
  4433 	}
  4434 
  4435 
  4436 
  4437 
  4438 EXPORT_C void RCriticalSection::Signal()
  4439 /**
  4440 Signals an exit from the critical section.
  4441 
  4442 A thread calls this function when it exits from the critical section.
  4443 The first eligible thread waiting on the critical section's queue of threads
  4444 is removed from that queue and, provided that it is not suspended for any other
  4445 reason, is marked as ready to run. That thread will, therefore, be the next to
  4446 proceed into the critical section.
  4447 */
  4448 	{
  4449 
  4450 	__ASSERT_ALWAYS(iBlocked<1,Panic(ECriticalSectionStraySignal));
  4451 	if (TInt(__e32_atomic_add_rel32(&iBlocked, 1)) < 0)
  4452 		RSemaphore::Signal();
  4453 	}
  4454 
  4455 
  4456 
  4457 
  4458 EXPORT_C TInt TFindThread::Next(TFullName &aResult)
  4459 /**
  4460 Gets the full name of the next global thread which matches the match pattern.
  4461 
  4462 @param aResult A reference to a TBuf descriptor with a defined maximum length.
  4463                If a matching global thread is found, its full name is set into
  4464                this descriptor. If no matching global thread is found,
  4465                the descriptor length is set to zero.
  4466 
  4467 @return KErrNone if successful, otherwise one of the other system-wide error
  4468                  codes.
  4469 */
  4470 	{
  4471 	return NextObject(aResult,EThread);
  4472 	}
  4473 
  4474 
  4475 
  4476 
  4477 EXPORT_C TThreadId RThread::Id() const
  4478 /**
  4479 Gets the Id of this thread.
  4480 
  4481 @return The Id of this thread.
  4482 */
  4483 	{
  4484 
  4485 	return TThreadId( (TUint)Exec::ThreadId(iHandle) );
  4486 	}
  4487 
  4488 
  4489 
  4490 
  4491 EXPORT_C void RThread::HandleCount(TInt& aProcessHandleCount, TInt& aThreadHandleCount) const
  4492 /**
  4493 Gets the number of handles open in this thread, and the number of handles open 
  4494 in the process which owns this thread.
  4495 
  4496 @param aProcessHandleCount On return, contains the number of handles open in
  4497                            the process which owns this thread.
  4498 @param aThreadHandleCount  On return, contains the number of handles open in
  4499                            this thread.
  4500 */
  4501 	{
  4502 
  4503 	Exec::HandleCount(iHandle,aProcessHandleCount,aThreadHandleCount);
  4504 	}
  4505 
  4506 
  4507 
  4508 
  4509 EXPORT_C TExceptionHandler User::ExceptionHandler()
  4510 /**
  4511 Gets a pointer to the exception handler for the current thread.
  4512 
  4513 @return A pointer to the exception handler.
  4514 */
  4515 	{
  4516 	return(Exec::ExceptionHandler(KCurrentThreadHandle));
  4517 	}
  4518 
  4519 
  4520 
  4521 
  4522 EXPORT_C TInt User::SetExceptionHandler(TExceptionHandler aHandler,TUint32 aMask)
  4523 /**
  4524 Sets a new exception handler for the current thread. Note that the handler is not
  4525 guaranteed to receive floating point exceptions (KExceptionFpe) when a hardware
  4526 floating point implementation is in use - see User::SetFloatingPointMode for
  4527 hardware floating point modes and whether they cause user-trappable exceptions.
  4528 
  4529 @param aHandler The new exception handler.
  4530 @param aMask    One or more flags defining the exception categories which
  4531                 the handler can handle.
  4532 
  4533 @return KErrNone if successful, otherwise another of the system-wide error codes.
  4534 
  4535 @see KExceptionAbort
  4536 @see KExceptionKill
  4537 @see KExceptionUserInterrupt
  4538 @see KExceptionFpe
  4539 @see KExceptionFault
  4540 @see KExceptionInteger
  4541 @see KExceptionDebug
  4542 */
  4543 	{
  4544 	return(Exec::SetExceptionHandler(KCurrentThreadHandle, aHandler, aMask));
  4545 	}
  4546 
  4547 
  4548 
  4549 
  4550 EXPORT_C void User::ModifyExceptionMask(TUint32 aClearMask, TUint32 aSetMask)
  4551 /**
  4552 Changes the set of exceptions which the current thread's exception
  4553 handler can deal with.
  4554 
  4555 aClearMask is the set of flags defining the set of exceptions which the
  4556 exception handler no longer deals with, while aSetMask is the set of flags
  4557 defining the new set of exceptions to be set.
  4558 
  4559 Flag clearing is done before flag setting.
  4560 
  4561 @param  aClearMask One or more flags defining the exceptions which the current
  4562                    exception handler no longer deals with.
  4563 @param  aSetMask   One or more flags defining the new set of exceptions which
  4564                    the current exception handler is to deal with.
  4565 */
  4566 	{
  4567 	Exec::ModifyExceptionMask(KCurrentThreadHandle, aClearMask, aSetMask);
  4568 	}
  4569 
  4570 
  4571 
  4572 
  4573 _LIT(KLitUserExec, "USER-EXEC");
  4574 EXPORT_C TInt User::RaiseException(TExcType aType)
  4575 /**
  4576 Raises an exception of a specified type on the current thread.
  4577 
  4578 If the thread has an exception handler to handle this type of exception,
  4579 then it is called.
  4580 
  4581 If the thread has no exception handler to handle this type of exception, then
  4582 the function raises a USER-EXEC 3 panic.
  4583 
  4584 Note that exception handlers are executed in the context of the thread on which
  4585 the exception is raised; control returns to the point of the exception. 
  4586 
  4587 @param aType The type of exception.
  4588 
  4589 @return KErrNone if successful, otherwise another of the system-wide
  4590         error codes.
  4591 */
  4592 	{
  4593 	if (Exec::IsExceptionHandled(KCurrentThreadHandle,aType,ETrue))
  4594 		{
  4595 		Exec::ThreadSetFlags(KCurrentThreadHandle, 0, KThreadFlagLastChance);
  4596 		TUint32 type = aType;
  4597 		User::HandleException(&type);
  4598 		}
  4599 	else
  4600 		User::Panic(KLitUserExec, ECausedException);
  4601 	return KErrNone;
  4602 	}
  4603 
  4604 
  4605 
  4606 
  4607 EXPORT_C TBool User::IsExceptionHandled(TExcType aType)
  4608 /**
  4609 Tests whether the specified exception type can be handled by the
  4610 current thread.
  4611 
  4612 @param aType The type of exception.
  4613 
  4614 @return True, if the thread has an exception handler which can handle
  4615         an exception of type aType.
  4616         False, if the thread has no exception handler or the thread has
  4617         an exception handler which cannot handle the exception defined
  4618         by aType.
  4619 */
  4620 	{
  4621 	return (Exec::IsExceptionHandled(KCurrentThreadHandle,aType,EFalse));
  4622 	}
  4623 
  4624 
  4625 
  4626 
  4627 EXPORT_C void RThread::Context(TDes8 &aDes) const
  4628 /**
  4629 Gets the register contents of this thread.
  4630 
  4631 @param aDes On return, contains the register contents, starting with R0.
  4632 */
  4633 	{
  4634 
  4635 	Exec::ThreadContext(iHandle,aDes);
  4636 	}
  4637 
  4638 
  4639 
  4640 
  4641 EXPORT_C void RThread::Resume() const
  4642 /**
  4643 Makes the thread eligible for execution.
  4644 
  4645 After a thread is created, it is put into a suspended state; the thread is 
  4646 not eligible to run until Resume() is called.
  4647 
  4648 This function must also be called to resume execution of this thread after 
  4649 it has been explicitly suspended by a call to Suspend().
  4650 
  4651 Note that when a thread is created, it is given the priority EPriorityNormal 
  4652 by default. The fact that a thread is initially put into a suspended state 
  4653 means that the thread priority can be changed by calling the thread's
  4654 SetPriority() member function before the thread is started by a call to Resume().
  4655 */
  4656 	{
  4657 
  4658 	Exec::ThreadResume(iHandle);
  4659 	}
  4660 
  4661 
  4662 
  4663 
  4664 EXPORT_C void RThread::Suspend() const
  4665 /**
  4666 Suspends execution of this thread.
  4667 
  4668 The thread is not scheduled to run until a subsequent call to Resume() is made.
  4669 */
  4670 	{
  4671 
  4672 	Exec::ThreadSuspend(iHandle);
  4673 	}
  4674 
  4675 
  4676 
  4677 
  4678 EXPORT_C TThreadPriority RThread::Priority() const
  4679 /**
  4680 Gets the priority of this thread.
  4681 
  4682 @return The priority.
  4683 */
  4684 	{
  4685 
  4686 	return(Exec::ThreadPriority(iHandle));
  4687 	}
  4688 
  4689 
  4690 
  4691 
  4692 EXPORT_C void RThread::SetProcessPriority(TProcessPriority aPriority) const
  4693 /**
  4694 Sets the priority of the process which owns this thread to one of the values 
  4695 defined by the TProcessPriority enumeration.
  4696 
  4697 The priority can be set to one of the four values:
  4698 
  4699 EPriorityLow
  4700 
  4701 EPriorityBackground
  4702 
  4703 EPriorityForeground
  4704 
  4705 EPriorityHigh
  4706 
  4707 The absolute priority of all threads owned by the process (and all threads 
  4708 owned by those threads etc.) are re-calculated.
  4709 
  4710 Note:
  4711 
  4712 The use of the priority values EPriorityWindowServer, EPriorityFileServer, 
  4713 EPriorityRealTimeServer and EPrioritySupervisor is restricted to Symbian OS, 
  4714 and any attempt to explicitly set any of these priority values raises a KERN-EXEC 
  4715 14 panic.
  4716 
  4717 @param aPriority The priority value.
  4718 
  4719 @deprecated Not allowed on threads in a different process.
  4720 			Replace with RProcess::SetPriority or RMessagePtr2::SetProcessPriority
  4721 */
  4722 	{
  4723 
  4724 	Exec::ThreadSetProcessPriority(iHandle,aPriority);
  4725 	}
  4726 
  4727 
  4728 
  4729 
  4730 EXPORT_C TProcessPriority RThread::ProcessPriority() const
  4731 /**
  4732 Gets the priority of the process which owns this thread.
  4733 
  4734 @return The process priority.
  4735 */
  4736 	{
  4737 
  4738 	return(Exec::ThreadProcessPriority(iHandle));
  4739 	}
  4740 
  4741 
  4742 
  4743 
  4744 EXPORT_C void RThread::SetPriority(TThreadPriority aPriority) const
  4745 /**
  4746 Sets the priority of the thread to one of the values defined by
  4747 the TThreadPriority enumeration. 
  4748 
  4749 The resulting absolute priority of the thread depends on the value of aPriority 
  4750 and the priority of the owning process.
  4751 
  4752 Use of the priority value EPriorityNull is restricted to Symbian OS, and any 
  4753 attempt to explicitly set this value causes a KERN-EXEC 14 panic to be raised.
  4754 
  4755 @param aPriority The priority value.
  4756 
  4757 @capability ProtServ if aPriority is EPriorityAbsoluteRealTime1 or higher
  4758 
  4759 @panic KERN-EXEC 14, if aPriority is invalid or set to EPriorityNull
  4760 @panic KERN-EXEC 46, if aPriority is EPriorityAbsoluteRealTime1 or higher
  4761                      and calling process does not have ProtServ capability
  4762 */
  4763 	{
  4764 
  4765 	Exec::ThreadSetPriority(iHandle,aPriority);
  4766 	}
  4767 
  4768 
  4769 
  4770 
  4771 EXPORT_C User::TCritical User::Critical(RThread aThread)
  4772 /**
  4773 Gets the critical state associated with the specified thread.
  4774 
  4775 @param aThread The thread whose critical state is to be retrieved.
  4776 
  4777 @return The critical state.
  4778 
  4779 @see User::SetCritical()
  4780 */
  4781 	{
  4782 	TUint32 flags = Exec::ThreadFlags(aThread.Handle());
  4783 	if (flags & KThreadFlagSystemPermanent)
  4784 		return ESystemPermanent;
  4785 	if (flags & KThreadFlagSystemCritical)
  4786 		return ESystemCritical;
  4787 	if (flags & KThreadFlagProcessPermanent)
  4788 		return EProcessPermanent;
  4789 	if (flags & KThreadFlagProcessCritical)
  4790 		return EProcessCritical;
  4791 	return ENotCritical;
  4792 	}
  4793 
  4794 
  4795 
  4796 
  4797 EXPORT_C User::TCritical User::Critical()
  4798 /**
  4799 Gets the critical state associated with the current thread.
  4800 
  4801 @return The critical state.
  4802 	
  4803 @see User::SetCritical()
  4804 */
  4805 	{
  4806 	RThread me;
  4807 	return User::Critical(me);
  4808 	}
  4809 
  4810 
  4811 
  4812 
  4813 /**
  4814 Sets up or changes the effect that termination of the current
  4815 thread has, either on its owning process, or on the whole system.
  4816 
  4817 The precise effect of thread termination is defined by 
  4818 the following specific values of the TCritical enum:
  4819 - ENotCritical
  4820 - EProcessCritical
  4821 - EProcessPermanent
  4822 - ESystemCritical
  4823 - ESystemPermanent
  4824 
  4825 Notes:
  4826 -# The enum value EAllThreadsCritical cannot be set using this function. It is
  4827 associated with a process, not a thread, and, if appropriate, should be set
  4828 using User::SetProcessCritical().
  4829 -# The states associated with ENotCritical, EProcessCritical,
  4830 EProcessPermanent, ESystemCritical and ESystemPermanent
  4831 are all mutually exclusive, i.e. the thread can only be in one of these states
  4832 at any one time
  4833 
  4834 @param aCritical The state to be set. 
  4835 
  4836 @return KErrNone, if successful;
  4837         KErrArgument, if EAllThreadsCritical is passed - this is a 
  4838         state associated with a process, and
  4839         you use User::SetProcessCritical() to set it.
  4840 
  4841 @capability ProtServ if aCritical==ESystemCritical or ESystemPermanent
  4842 
  4843 @see User::Critical()
  4844 @see User::ProcessCritical()
  4845 @see User::SetProcessCritical()
  4846 */
  4847 EXPORT_C TInt User::SetCritical(TCritical aCritical)
  4848 	{
  4849 	const TUint32 clear =	KThreadFlagSystemPermanent | KThreadFlagSystemCritical |
  4850 							KThreadFlagProcessPermanent | KThreadFlagProcessCritical;
  4851 	TUint32 set;
  4852 	switch (aCritical)
  4853 		{
  4854 		case ENotCritical:		set = 0;							break;
  4855 		case EProcessCritical:	set = KThreadFlagProcessCritical;	break;
  4856 		case EProcessPermanent:	set = KThreadFlagProcessPermanent;	break;
  4857 		case ESystemCritical:	set = KThreadFlagSystemCritical;	break;
  4858 		case ESystemPermanent:	set = KThreadFlagSystemPermanent;	break;
  4859 		default:													return KErrArgument;
  4860 		}
  4861 	Exec::ThreadSetFlags(KCurrentThreadHandle, clear, set);
  4862 	return KErrNone;
  4863 	}
  4864 
  4865 
  4866 
  4867 
  4868 EXPORT_C TInt User::SetRealtimeState(TRealtimeState aState)
  4869 	{
  4870 	const TUint32 clear =	KThreadFlagRealtime | KThreadFlagRealtimeTest;
  4871 	TUint32 set;
  4872 	switch (aState)
  4873 		{
  4874 		case ERealtimeStateOff:		set = 0;											break;
  4875 		case ERealtimeStateOn:		set = KThreadFlagRealtime;							break;
  4876 		case ERealtimeStateWarn:	set = KThreadFlagRealtime|KThreadFlagRealtimeTest;	break;
  4877 		default:																		return KErrArgument;
  4878 		}
  4879 	Exec::ThreadSetFlags(KCurrentThreadHandle, clear, set);
  4880 	return KErrNone;
  4881 	}
  4882 
  4883 
  4884 
  4885 
  4886 EXPORT_C User::TCritical User::ProcessCritical(RProcess aProcess)
  4887 /**
  4888 Gets the critical state associated with the specified process.
  4889 
  4890 @param aProcess The process whose critical state is to be retrieved.
  4891 
  4892 @return The critical state.
  4893 
  4894 @see User::SetProcessCritical()
  4895 */
  4896 	{
  4897 	TUint32 flags = Exec::ProcessFlags(aProcess.Handle());
  4898 	if (flags & KProcessFlagSystemPermanent)
  4899 		return ESystemPermanent;
  4900 	if (flags & KProcessFlagSystemCritical)
  4901 		return ESystemCritical;
  4902 	if (flags & (KThreadFlagProcessPermanent | KThreadFlagProcessCritical))
  4903 		return EAllThreadsCritical;
  4904 	return ENotCritical;
  4905 	}
  4906 
  4907 
  4908 
  4909 
  4910 EXPORT_C User::TCritical User::ProcessCritical()
  4911 /**
  4912 Gets the critical state associated with the current process.
  4913 
  4914 @return The critical state.
  4915 	
  4916 @see User::SetProcessCritical()
  4917 */
  4918 	{
  4919 	RProcess me;
  4920 	return User::ProcessCritical(me);
  4921 	}
  4922 
  4923 
  4924 
  4925 
  4926 EXPORT_C TInt User::SetProcessCritical(TCritical aCritical)
  4927 /**
  4928 Sets up or changes the effect that termination of subsequently created threads
  4929 will have, either on the owning process, or on the whole system.
  4930 
  4931 It is important to note that we are not referring to threads that have already
  4932 been created, but threads that will be created subsequent to a call to this function.
  4933 
  4934 The precise effect of thread termination is defined by the following specific
  4935 values of the TCritical enum: 
  4936 - ENotCritical
  4937 - EAllThreadsCritical
  4938 - ESystemCritical
  4939 - ESystemPermanent
  4940 
  4941 Notes:
  4942 -# The enum values EProcessCritical and EProcessPermanent cannot be set using
  4943 this function. They are states associated with
  4944 a thread, not a process, and, if appropriate, should be set
  4945 using User::SetCritical().
  4946 -# The states associated with ENotCritical, EAllThreadsCritical,
  4947 ESystemCritical and ESystemPermanent are all mutually exclusive, i.e. the
  4948 process can only be in one of these states at any one time.
  4949 
  4950 @param aCritical The state to be set. 
  4951 
  4952 @return KErrNone, if successful;
  4953         KErrArgument, if either EProcessCritical or EProcessPermanent
  4954         is passed - these are states associated with a thread, and
  4955         you use User::SetCritical() to set them.
  4956 
  4957 @capability ProtServ if aCritical==ESystemCritical or ESystemPermanent
  4958 
  4959 @see User::ProcessCritical()
  4960 @see User::SetCritical()
  4961 @see User::Critical()
  4962 */
  4963 	{
  4964 	const TUint32 clear =	KProcessFlagSystemPermanent | KProcessFlagSystemCritical |
  4965 							KThreadFlagProcessPermanent | KThreadFlagProcessCritical;
  4966 	TUint32 set;
  4967 	switch (aCritical)
  4968 		{
  4969 		case ENotCritical:			set = 0;							break;
  4970 		case EAllThreadsCritical:	set = KThreadFlagProcessCritical;	break;
  4971 		case ESystemCritical:		set = KProcessFlagSystemCritical;	break;
  4972 		case ESystemPermanent:		set = KProcessFlagSystemPermanent|KProcessFlagSystemCritical;	break;
  4973 		default:														return KErrArgument;
  4974 		}
  4975 	Exec::ProcessSetFlags(KCurrentProcessHandle, clear, set);
  4976 	return KErrNone;
  4977 	}
  4978 
  4979 
  4980 
  4981 
  4982 EXPORT_C TBool User::PriorityControl()
  4983 /**
  4984 Tests whether the current process allows other processes to switch its priority 
  4985 between 'foreground' and 'background'.
  4986 
  4987 @return True, if the current process allows other processes to switch its priority;
  4988         false, otherwise.
  4989 */
  4990 	{
  4991 	return Exec::ProcessFlags(KCurrentProcessHandle) & KProcessFlagPriorityControl;
  4992 	}
  4993 
  4994 
  4995 
  4996 
  4997 EXPORT_C void User::SetPriorityControl(TBool aEnable)
  4998 /**
  4999 Allows the current process to choose to have its priority switched by another
  5000 process between 'foreground' and 'background'.
  5001 
  5002 By default a process does not allow this.
  5003 
  5004 @param aEnable If ETrue, allows other processes to switch the current process's
  5005                priority.
  5006                If EFalse, prevents other processes from switching the current
  5007                process's priority.
  5008 */
  5009 	{
  5010 	TUint32 set = aEnable ? KProcessFlagPriorityControl : 0;
  5011 	Exec::ProcessSetFlags(KCurrentProcessHandle, KProcessFlagPriorityControl, set);
  5012 	}
  5013 
  5014 
  5015 
  5016 EXPORT_C TInt RThread::RequestCount() const
  5017 /**
  5018 Gets this thread's request semaphore count.
  5019 
  5020 The request semaphore is created when a thread is created, and is used to 
  5021 support asynchronous requests.
  5022 
  5023 A negative value implies that this thread is waiting for at least
  5024 one asynchronous request to complete.
  5025 
  5026 @return This thread's request semaphore count.
  5027 */
  5028 	{
  5029 
  5030 	return(Exec::ThreadRequestCount(iHandle));
  5031 	}
  5032 
  5033 
  5034 
  5035 
  5036 EXPORT_C TExitType RThread::ExitType() const
  5037 /**
  5038 Tests whether the thread has ended and, if it has ended, return how it ended.
  5039 
  5040 This information allows the caller to distinguish between normal termination 
  5041 and a panic.
  5042 
  5043 @return An enumeration whose enumerators describe how the thread has ended.
  5044 */
  5045 	{
  5046 
  5047 	return(Exec::ThreadExitType(iHandle));
  5048 	}
  5049 
  5050 
  5051 
  5052 
  5053 EXPORT_C TInt RThread::ExitReason() const
  5054 /**
  5055 Gets the specific reason associated with the end of this thread.
  5056 
  5057 The reason number together with the category name is a way of distinguishing 
  5058 between different causes of thread termination.
  5059 
  5060 If the thread has panicked, this value is the panic number. If the thread 
  5061 has ended as a result of a call to Kill(), then the value is the one supplied 
  5062 by Kill().
  5063 
  5064 If the thread is still alive, then the returned value is zero.
  5065 
  5066 @return The reason associated with the end of the thread.
  5067 */
  5068 	{
  5069 
  5070 	return(Exec::ThreadExitReason(iHandle));
  5071 	}
  5072 
  5073 
  5074 
  5075 
  5076 EXPORT_C TExitCategoryName RThread::ExitCategory() const
  5077 /**
  5078 Gets the name of the category associated with the end of the thread.
  5079 
  5080 The category name together with the reason number is a way of distinguishing
  5081 between different causes of thread termination.
  5082 
  5083 If the thread has panicked, the category name is the panic category name; 
  5084 for example, E32USER-CBase or KERN-EXEC. If the thread has ended as a result 
  5085 of call to Kill(), then the category name is Kill.
  5086 
  5087 If the thread has not ended, then the category name is empty, i.e. the length 
  5088 of the category name is zero.
  5089 
  5090 @return A TBuf descriptor with a defined maximum length containing the name 
  5091         of the category associated with the end of the thread.
  5092 
  5093 @see TBuf
  5094 */
  5095 	{
  5096 	TExitCategoryName n;
  5097 	TPtr8 n8(((TUint8*)n.Ptr()) + KMaxExitCategoryName, KMaxExitCategoryName);
  5098 	Exec::ThreadExitCategory(iHandle,n8);
  5099 	n.Copy(n8);
  5100 	return(n);
  5101 	}
  5102 
  5103 
  5104 
  5105 
  5106 EXPORT_C TInt RThread::StackInfo(TThreadStackInfo& aInfo) const
  5107 /**
  5108 Gets information about a thread's user mode stack.
  5109 
  5110 @param aInfo The TThreadStackInfo object to write the stack infomation to.
  5111 
  5112 @return KErrNone, if sucessful;
  5113 		KErrGeneral, if the thread doesn't have a user mode stack,
  5114 		or it has terminated.
  5115 
  5116 @see TThreadStackInfo
  5117 */
  5118 	{
  5119 	return(Exec::ThreadStackInfo(iHandle,aInfo));
  5120 	}
  5121 
  5122 
  5123 
  5124 
  5125 EXPORT_C TInt RThread::GetCpuTime(TTimeIntervalMicroSeconds& aCpuTime) const
  5126 /**
  5127 Gets the CPU usage for this thread.
  5128 
  5129 This function is not supported on version 8.0b or 8.1b, and returns
  5130 KErrNotSupported.  From 9.1 onwards it may be supported if the kernel has been
  5131 compiled with the MONITOR_THREAD_CPU_TIME macro defined.
  5132 
  5133 @param aCpuTime A reference to a time interval object supplied by the caller. 
  5134                                 
  5135 @return KErrNone - if thread CPU time is available.
  5136 
  5137         KErrNotSupported - if this feature is not supported on this
  5138         version or build of the OS.
  5139 */
  5140 	{
  5141 	return Exec::ThreadGetCpuTime(iHandle, (TInt64&)aCpuTime.Int64());
  5142 	}
  5143 
  5144 
  5145 
  5146 
  5147 EXPORT_C void User::After(TTimeIntervalMicroSeconds32 aInterval)
  5148 /**
  5149 Suspends the current thread until a specified time interval has expired.
  5150 
  5151 The resolution of the timer depends on the hardware, but is normally 
  5152 1 Symbian OS tick (approximately 1/64 second).
  5153 
  5154 @param aInterval The time interval for which the current thread is to be 
  5155                   suspended, in microseconds.
  5156                   
  5157 @panic USER 86, if the time interval is negative.
  5158 */
  5159 	{
  5160 
  5161 	__ASSERT_ALWAYS(aInterval.Int()>=0,::Panic(EExecAfterTimeNegative));
  5162 	TRequestStatus s=KRequestPending;
  5163 	Exec::After(aInterval.Int(),s);
  5164 	User::WaitForRequest(s);
  5165 	}
  5166 
  5167 
  5168 
  5169 
  5170 EXPORT_C void User::AfterHighRes(TTimeIntervalMicroSeconds32 aInterval)
  5171 /**
  5172 Suspends the current thread until a specified time interval has expired to
  5173 a resolution of 1ms .
  5174 
  5175 @param aInterval The time interval for which the current thread is to be 
  5176                   suspended, in microseconds.
  5177                   
  5178 @panic USER 86, if the time interval is negative.
  5179 */
  5180 	{
  5181 
  5182 	__ASSERT_ALWAYS(aInterval.Int()>=0,::Panic(EExecAfterTimeNegative));
  5183 	TRequestStatus s=KRequestPending;
  5184 	Exec::AfterHighRes(aInterval.Int(),s);
  5185 	User::WaitForRequest(s);
  5186 	}
  5187 
  5188 
  5189 
  5190 
  5191 EXPORT_C TInt User::At(const TTime &aTime)
  5192 /**
  5193 Suspends the current thread until the specified absolute time, in the current time zone.
  5194 
  5195 If the machine is off at that time, the machine will be turned on again.
  5196 
  5197 @param aTime The absolute time, in the current time zone, until which the current thread is to
  5198              be suspended.
  5199 
  5200 @return On completion, contains the status of the request to suspend the
  5201         current thread:
  5202 
  5203         KErrNone - suspension of the current thread completed normally at 
  5204         the requested time.
  5205 
  5206         KErrAbort - suspension of the current thread was aborted 
  5207         because the system time changed.
  5208 
  5209         KErrUnderflow - the requested completion time is in the past.
  5210 
  5211         KErrOverFlow - the requested completion time is too far in the future.
  5212 */
  5213 	{
  5214 
  5215 	TRequestStatus s=KRequestPending;
  5216 	TInt64 time=aTime.Int64();
  5217 	time -= ((TInt64)User::UTCOffset().Int()) * 1000000;
  5218 	Exec::At(time,s);
  5219 	User::WaitForRequest(s);
  5220 	return(s.Int());
  5221 	}
  5222 
  5223 
  5224 
  5225 
  5226 EXPORT_C void RTimer::Cancel()
  5227 /**
  5228 Cancels any outstanding request for a timer event.
  5229 
  5230 Any outstanding timer event completes with KErrCancel.
  5231 */
  5232 	{
  5233 
  5234 	Exec::TimerCancel(iHandle);
  5235 	}
  5236 
  5237 
  5238 
  5239 
  5240 EXPORT_C void RTimer::After(TRequestStatus &aStatus,TTimeIntervalMicroSeconds32 aInterval)
  5241 //
  5242 // Request a relative timer.
  5243 //
  5244 /**
  5245 Requests an event after the specified interval.
  5246 
  5247 The counter for this type of request stops during power-down.
  5248 A 5 second timer will complete late if, for example, the machine is turned off
  5249 2 seconds after the request is made.
  5250 
  5251 @param aStatus    On completion, contains the status of the request.
  5252                   This is KErrNone if the timer completed normally at the
  5253                   requested time, otherwise another of the
  5254                   system-wide error codes.
  5255 
  5256 @param aInterval  The time interval, in microseconds, after which an event
  5257                   is to occur.
  5258 
  5259 @panic USER 87, if aInterval is negative.
  5260 @panic KERN-EXEC 15, if this function is called while a request for a timer
  5261        event is still outstanding.
  5262 */
  5263 	{
  5264 
  5265 	__ASSERT_ALWAYS(aInterval.Int()>=0,::Panic(ERTimerAfterTimeNegative));
  5266 	aStatus=KRequestPending;
  5267 	Exec::TimerAfter(iHandle,aStatus,aInterval.Int());
  5268 	}
  5269 
  5270 
  5271 
  5272 
  5273 EXPORT_C void RTimer::AfterTicks(TRequestStatus& aStatus, TInt aTicks)
  5274 //
  5275 // Request a relative timer in system ticks.
  5276 //
  5277 /**
  5278 Requests an event after the specified interval.
  5279 
  5280 The counter for this type of request stops during power-down.
  5281 A 5 tick timer will complete late if, for example, the machine is turned off
  5282 2 ticks after the request is made.
  5283 
  5284 @param aStatus    On completion, contains the status of the request.
  5285                   This is KErrNone if the timer completed normally at the
  5286                   requested time, otherwise another of the
  5287                   system-wide error codes.
  5288 
  5289 @param aTicks     The time interval, in system ticks, after which an event
  5290                   is to occur.
  5291 
  5292 @panic USER 87, if aTicks is negative.
  5293 @panic KERN-EXEC 15, if this function is called while a request for a timer
  5294        event is still outstanding.
  5295 */
  5296 	{
  5297 	__ASSERT_ALWAYS(aTicks >= 0, ::Panic(ERTimerAfterTimeNegative));
  5298 	aStatus = KRequestPending;
  5299 	Exec::TimerAfter(iHandle, aStatus, -aTicks);
  5300 	}
  5301 
  5302 
  5303 
  5304 
  5305 EXPORT_C void RTimer::HighRes(TRequestStatus &aStatus,TTimeIntervalMicroSeconds32 aInterval)
  5306 //
  5307 // Request a relative timer to a resolution of 1ms.
  5308 //
  5309 /**
  5310 Requests an event after the specified interval to a resolution of 1ms. 
  5311 The "HighRes timer" counter stops during power-down (the same as "after timer"). 
  5312 
  5313 @param aStatus    On completion, contains the status of the request.
  5314                   This is KErrNone if the timer completed normally at the
  5315                   requested time, otherwise another of the
  5316                   system-wide error codes.
  5317 
  5318 @param aInterval  The time interval, in microseconds, after which an event
  5319                   is to occur.
  5320 
  5321 @panic USER 87, if aInterval is negative.
  5322 @panic KERN-EXEC 15, if this function is called while a request for a timer
  5323        event is still outstanding.
  5324 */
  5325 	{
  5326 
  5327 	__ASSERT_ALWAYS(aInterval.Int()>=0,::Panic(ERTimerAfterTimeNegative));
  5328 	aStatus=KRequestPending;
  5329 	Exec::TimerHighRes(iHandle,aStatus,aInterval.Int());
  5330 	}
  5331 
  5332 
  5333 
  5334 
  5335 EXPORT_C void RTimer::At(TRequestStatus &aStatus,const TTime &aTime)
  5336 //
  5337 // Request an absolute timer.
  5338 //
  5339 /**
  5340 Requests an event at a given system time (in the current time zone).
  5341 
  5342 If the machine is off at that time, it is automatically turned on.
  5343 
  5344 @param aStatus On completion, contains the status of the request:
  5345                KErrNone, the timer completed normally at the requested time;
  5346                KErrCancel, the timer was cancelled;
  5347                KErrAbort, the timer was aborted because the system time changed;
  5348                KErrUnderflow, the requested completion time is in the past;
  5349                KErrOverFlow, the requested completion time is too far in the future;
  5350 @param aTime   The time at which the timer will expire.
  5351 
  5352 @panic KERN-EXEC 15, if this function is called while a request for a timer
  5353        event is still outstanding.
  5354 */
  5355 	{
  5356 
  5357 	aStatus=KRequestPending;
  5358 	TInt64 time=aTime.Int64();
  5359 	time -= ((TInt64)User::UTCOffset().Int()) * 1000000;
  5360 	Exec::TimerAt(iHandle,aStatus,I64LOW(time),I64HIGH(time));
  5361 	}
  5362 
  5363 
  5364 
  5365 
  5366 EXPORT_C void RTimer::AtUTC(TRequestStatus &aStatus,const TTime &aUTCTime)
  5367 //
  5368 // Request an absolute timer in UTC time.
  5369 //
  5370 /**
  5371 Requests an event at a given UTC time.
  5372 
  5373 If the machine is off at that time, it is automatically turned on.
  5374 
  5375 @param aStatus On completion, contains the status of the request:
  5376                KErrNone, the timer completed normally at the requested time;
  5377                KErrCancel, the timer was cancelled;
  5378                KErrAbort, the timer was aborted because the system time changed;
  5379                KErrUnderflow, the requested completion time is in the past;
  5380                KErrOverFlow, the requested completion time is too far in the future;
  5381 @param aTime   The time at which the timer will expire.
  5382 
  5383 @panic KERN-EXEC 15, if this function is called while a request for a timer
  5384        event is still outstanding.
  5385 */
  5386 	{
  5387 
  5388 	aStatus=KRequestPending;
  5389 	Exec::TimerAt(iHandle,aStatus,I64LOW(aUTCTime.Int64()),I64HIGH(aUTCTime.Int64()));
  5390 	}
  5391 
  5392 
  5393 
  5394 
  5395 EXPORT_C void RTimer::Lock(TRequestStatus &aStatus,TTimerLockSpec aLock)
  5396 //
  5397 // Request an absolute timer.
  5398 //
  5399 /**
  5400 Requests an event on a specified second fraction.
  5401 
  5402 @param aStatus On completion, contains the status of the request:
  5403                KErrGeneral, the first time this is called;
  5404                KErrNone, the timer completed normally at the requested time;
  5405                KErrCancel, the timer was cancelled;
  5406                KErrAbort, the timer was aborted because the system time changed;
  5407                KErrUnderflow, the requested completion time is in the past;
  5408                KErrOverFlow, the requested completion time is too far in the future.
  5409 @param aLock   The fraction of a second at which the timer completes.
  5410 
  5411 @panic KERN-EXEC 15, if this function is called while a request for a timer
  5412        event is still outstanding.
  5413 */
  5414 	{
  5415 	aStatus=KRequestPending;
  5416 	Exec::TimerLock(iHandle,aStatus,aLock);
  5417 	}
  5418 
  5419 
  5420 /**
  5421 Requests an event to be triggered when aSeconds is exactly, (ie not greater or 
  5422 less than), the time elapsed (to the nearest second) since the last user activity.
  5423 If the event trigger time has been "missed", instead of triggering late,
  5424 the timer waits for the next user activity, to try and satisfy the condition.
  5425 
  5426 That is to say, if there was user activity within the last aSeconds,
  5427 the event will be triggered after aSeconds of continuous inactivity following that activity.
  5428 Otherwise, if there has been no such activity within this time, an event is
  5429 triggered after aSeconds of continuous inactivity following the next user activity
  5430 in the future.
  5431 
  5432 It follows from this, that you can request an event directly after the next
  5433 user activity by supplying a time interval of zero.
  5434 
  5435 
  5436 @param aStatus  On completion, contains the status of the request:
  5437                 KErrNone, the timer completed normally;
  5438                 KErrCancel, the timer was cancelled;
  5439                 KErrArgument, if aSeconds is less then zero;
  5440                 KErrOverflow, if aSecond reaches its limit (which is platform specific but greater then one and a half day).
  5441 @param aSeconds The time interval in seconds.
  5442 
  5443 @panic KERN-EXEC 15, if this function is called while a request for a timer
  5444        event is still outstanding.
  5445 */
  5446 EXPORT_C void RTimer::Inactivity(TRequestStatus &aStatus, TTimeIntervalSeconds aSeconds)
  5447 	{
  5448 	aStatus=KRequestPending;
  5449 	Exec::TimerInactivity(iHandle, aStatus, aSeconds.Int());
  5450 	}
  5451 
  5452 
  5453 
  5454 
  5455 EXPORT_C TInt RChangeNotifier::Logon(TRequestStatus& aStatus) const
  5456 /**
  5457 Issues a request for notification when changes occur in the environment. 
  5458 
  5459 A switch in locale, or crossing over past midnight, are examples of changes
  5460 that are reported.
  5461 
  5462 When a change in the environment occurs, the request completes and the 
  5463 TRquestStatus object will contain one or more of the bit values defined
  5464 by the TChanges enum.
  5465 
  5466 Alternatively, if an outstanding request is cancelled by a call to
  5467 this handle's LogonCancel() member function, then the request completes
  5468 with a KErrCancel.
  5469 
  5470 Note that if this is the first notification request after creation of
  5471 the change notifier, then this request completes immediately.
  5472 
  5473 @param aStatus A reference to the request status object.
  5474 
  5475 @return KErrInUse, if there is an outstanding request; KErrNone otherwise.
  5476 
  5477 @see TChanges
  5478 @see RChangeNotifier::Logon()
  5479 */
  5480 	{
  5481 	
  5482 	aStatus=KRequestPending;
  5483 	return(Exec::ChangeNotifierLogon(iHandle,aStatus));
  5484 	}
  5485 
  5486 
  5487 
  5488 
  5489 EXPORT_C TInt RChangeNotifier::LogonCancel() const
  5490 /**
  5491 Cancels an outstanding change notification request.
  5492 
  5493 @return KErrGeneral, if there is no outstanding request; KErrNone otherwise.
  5494 
  5495 @see RChangeNotifier::Logon()
  5496 */
  5497 	{
  5498 	
  5499 	return(Exec::ChangeNotifierLogoff(iHandle));
  5500 	}
  5501 
  5502 
  5503 
  5504 
  5505 EXPORT_C void UserSvr::CaptureEventHook()
  5506 //
  5507 // Capture the event hook
  5508 //
  5509 	{
  5510 
  5511 	Exec::CaptureEventHook();
  5512 	}
  5513 
  5514 EXPORT_C void UserSvr::ReleaseEventHook()
  5515 //
  5516 // Release the event hook
  5517 //
  5518 	{
  5519 
  5520 	Exec::ReleaseEventHook();
  5521 	}
  5522 
  5523 EXPORT_C void UserSvr::RequestEvent(TRawEventBuf &anEvent,TRequestStatus &aStatus)
  5524 //
  5525 // Request the next event.
  5526 //
  5527 	{
  5528 
  5529 	aStatus=KRequestPending;
  5530 	Exec::RequestEvent(anEvent,aStatus);
  5531 	}
  5532 
  5533 EXPORT_C void UserSvr::RequestEventCancel()
  5534 //
  5535 // Cancel the event request.
  5536 //
  5537 	{
  5538 
  5539 	Exec::RequestEventCancel();
  5540 	}
  5541 
  5542 /**
  5543 Add an event to the queue.
  5544 
  5545 @param anEvent The raw hardware event to be added to the event queue.
  5546 @return KErrNone, if successful; KErrPermissionDenied, if the caller has 
  5547 insufficient capability; otherwise, one of the other system-wide error codes.
  5548 
  5549 @capability SwEvent
  5550 @capability PowerMgmt for ESwitchOff, ERestartSystem, ECaseOpen and ECaseClose
  5551 */
  5552 EXPORT_C TInt UserSvr::AddEvent(const TRawEvent& anEvent)
  5553 	{
  5554 
  5555     return(Exec::AddEvent(anEvent));
  5556 	}
  5557 
  5558 EXPORT_C void UserSvr::ScreenInfo(TDes8 &anInfo)
  5559 //
  5560 // Get the screen info.
  5561 //
  5562 	{
  5563 
  5564 	Exec::HalFunction(EHalGroupDisplay,EDisplayHalScreenInfo,(TAny*)&anInfo,NULL);
  5565 	}
  5566 
  5567 #ifdef __USERSIDE_THREAD_DATA__
  5568 
  5569 EXPORT_C TAny* UserSvr::DllTls(TInt aHandle)
  5570 //
  5571 // Return the value of the Thread Local Storage variable.
  5572 //
  5573 	{
  5574 	return LocalThreadData()->DllTls(aHandle, KDllUid_Default);
  5575 	}
  5576 
  5577 EXPORT_C TAny* UserSvr::DllTls(TInt aHandle, TInt aDllUid)
  5578 //
  5579 // Return the value of the Thread Local Storage variable.
  5580 //
  5581 	{
  5582 	return LocalThreadData()->DllTls(aHandle, aDllUid);
  5583 	}
  5584 
  5585 #else
  5586 
  5587 EXPORT_C TAny* UserSvr::DllTls(TInt aHandle)
  5588 //
  5589 // Return the value of the Thread Local Storage variable.
  5590 //
  5591 	{
  5592 
  5593 	return Exec::DllTls(aHandle, KDllUid_Default);
  5594 	}
  5595 
  5596 EXPORT_C TAny* UserSvr::DllTls(TInt aHandle, TInt aDllUid)
  5597 //
  5598 // Return the value of the Thread Local Storage variable.
  5599 //
  5600 	{
  5601 
  5602 	return Exec::DllTls(aHandle, aDllUid);
  5603 	}
  5604 
  5605 #endif
  5606 
  5607 EXPORT_C void UserSvr::DllFileName(TInt aHandle, TDes& aFileName)
  5608 //
  5609 // Return the filename of this dll
  5610 //
  5611 	{
  5612 	TBuf8<KMaxFileName> n8;
  5613 	Exec::DllFileName(aHandle, n8);
  5614 	aFileName.Copy(n8);
  5615 	}
  5616 
  5617 EXPORT_C TBool UserSvr::TestBootSequence()
  5618 //
  5619 // Is the machine being booted by the test department?
  5620 //
  5621     {
  5622 
  5623 	return Exec::HalFunction(EHalGroupPower,EPowerHalTestBootSequence,NULL,NULL);
  5624     }
  5625 
  5626 /**
  5627 Register whether the W/S takes care of turning the screen on
  5628 */
  5629 EXPORT_C void UserSvr::WsRegisterSwitchOnScreenHandling(TBool aState)
  5630     {
  5631 
  5632 	Exec::HalFunction(EHalGroupDisplay,EDisplayHalWsRegisterSwitchOnScreenHandling,(TAny*)aState,NULL);
  5633     }
  5634 
  5635 EXPORT_C void UserSvr::WsSwitchOnScreen()
  5636 //
  5637 // W/S switch on the screen
  5638 //
  5639     {
  5640 
  5641 	Exec::HalFunction(EHalGroupDisplay,EDisplayHalWsSwitchOnScreen,NULL,NULL);
  5642     }
  5643 
  5644 
  5645 EXPORT_C TUint32 UserSvr::DebugMask()
  5646 /**
  5647 Return the kernel debug mask at index 0
  5648 */
  5649     {
  5650 	return Exec::DebugMask();
  5651     }
  5652 
  5653 
  5654 EXPORT_C TUint32 UserSvr::DebugMask(TUint aIndex)
  5655 /**
  5656 Return the kernel debug mask at the given index position
  5657 
  5658 @param aIndex An index of which 32 bit mask word is to be accessed
  5659 */
  5660     {
  5661 	return Exec::DebugMaskIndex(aIndex);
  5662     }
  5663 
  5664 
  5665 
  5666 EXPORT_C TTrapHandler *User::TrapHandler()
  5667 /**
  5668 Gets a pointer to the current thread's trap handler.
  5669 
  5670 Note that TTrapHandler is an abstract base class; a trap handler must be
  5671 implemented as a derived class.
  5672 
  5673 @return A pointer to the current thread's trap handler, if any. NULL, if no 
  5674         pre-existing trap handler is set.
  5675 */
  5676 	{
  5677 
  5678 	return GetTrapHandler();
  5679 	}
  5680 
  5681 
  5682 
  5683 
  5684 EXPORT_C TTrapHandler *User::SetTrapHandler(TTrapHandler *aHandler)
  5685 /**
  5686 Sets the current thread's trap handler and returns a pointer to any pre-existing 
  5687 trap handler.
  5688 
  5689 Pass a NULL pointer to this function to clear the trap handler.
  5690 
  5691 The trap handler works with the TRAP mechanism to handle the effects of a 
  5692 leave.
  5693 
  5694 Note that TTrapHandler is an abstract base class; a trap handler must be
  5695 implemented as a derived class.
  5696 
  5697 @param aHandler A pointer to the trap handler which is to be installed as 
  5698                 the current thread's trap handler.
  5699                 
  5700 @return A pointer to the current thread's pre-existing trap handler, if any. 
  5701         NULL, if no pre-existing trap handler is set.
  5702         
  5703 @see TRAP
  5704 @see TRAPD
  5705 */
  5706 	{
  5707 
  5708 	TTrapHandler* prev;
  5709 #if defined(__USERSIDE_THREAD_DATA__) && defined(__LEAVE_EQUALS_THROW__)
  5710 	prev = LocalThreadData()->iTrapHandler;
  5711 #else
  5712 	prev = Exec::SetTrapHandler(aHandler);
  5713 #endif
  5714 #ifdef __USERSIDE_THREAD_DATA__
  5715 	LocalThreadData()->iTrapHandler = aHandler;
  5716 #endif
  5717 	return prev;	
  5718 	}
  5719 
  5720 #ifndef __LEAVE_EQUALS_THROW__
  5721 EXPORT_C TTrapHandler* User::MarkCleanupStack()
  5722 /**
  5723 If there's a TTrapHandler installed marks the cleanup stack and returns 
  5724 the TTrapHandler for subsequent use in UnMarkCleanupStack. 
  5725 
  5726 Only intended for use in the defintion of TRAP and TRAPD and only when 
  5727 User::Leave is defined in terms of THROW.
  5728 
  5729 @return A pointer to the current thread's pre-existing trap handler, if any. 
  5730         NULL, if no pre-existing trap handler is set.
  5731 
  5732 @see TRAP
  5733 @see TRAPD
  5734 */
  5735 	{ 
  5736 	return (TTrapHandler*)0; 
  5737 	}
  5738 
  5739 
  5740 EXPORT_C void User::UnMarkCleanupStack(TTrapHandler* /*aHandler*/)
  5741 /**
  5742 If passed a non-null TTrapHandler unmarks the cleanup stack.
  5743 
  5744 Only intended for use in the defintion of TRAP and TRAPD and only when 
  5745 User::Leave is defined in terms of THROW.
  5746 
  5747 @see TRAP
  5748 @see TRAPD
  5749 */
  5750 	{}
  5751 
  5752 #else
  5753 
  5754 EXPORT_C TTrapHandler* User::MarkCleanupStack()
  5755 /**
  5756 If there's a TTrapHandler installed marks the cleanup stack and returns 
  5757 the TTrapHandler for subsequent use in UnMarkCleanupStack. 
  5758 
  5759 Only intended for use in the defintion of TRAP and TRAPD and only when 
  5760 User::Leave is defined in terms of THROW.
  5761 
  5762 @return A pointer to the current thread's pre-existing trap handler, if any. 
  5763         NULL, if no pre-existing trap handler is set.
  5764 
  5765 @see TRAP
  5766 @see TRAPD
  5767 */
  5768 	{
  5769 
  5770 	TTrapHandler* pH = GetTrapHandler();
  5771 	if (pH)
  5772 		pH->Trap();
  5773 	return pH;
  5774 	}
  5775 
  5776 EXPORT_C void User::UnMarkCleanupStack(TTrapHandler* aHandler)
  5777 /**
  5778 If passed a non-null TTrapHandler unmarks the cleanup stack.
  5779 
  5780 Only intended for use in the defintion of TRAP and TRAPD and only when 
  5781 User::Leave is defined in terms of THROW.
  5782 
  5783 @see TRAP
  5784 @see TRAPD
  5785 */
  5786 	{
  5787 
  5788 	if (aHandler)
  5789 		aHandler->UnTrap();
  5790 	}
  5791 
  5792 #endif
  5793 
  5794 
  5795 EXPORT_C TInt User::Beep(TInt aFrequency,TTimeIntervalMicroSeconds32 aDuration)
  5796 /**
  5797 Makes a beep tone with a specified frequency and duration.
  5798 
  5799 This function should not be used. It exists to maintain compatibility with
  5800 older versions of Symban OS.
  5801 */
  5802 	{
  5803 
  5804 	return Exec::HalFunction(EHalGroupSound,ESoundHalBeep,(TAny*)aFrequency,(TAny*)aDuration.Int());
  5805 	}
  5806 
  5807 
  5808 
  5809 
  5810 // Unused, exists only for BC reasons
  5811 EXPORT_C TInt UserSvr::HalGet(TInt, TAny*)
  5812 	{
  5813 	return KErrNotSupported;
  5814 	}
  5815 
  5816 // Unused, exists only for BC reasons
  5817 EXPORT_C TInt UserSvr::HalSet(TInt, TAny*)
  5818 	{
  5819 	return KErrNotSupported;
  5820 	}
  5821 
  5822 EXPORT_C TInt UserSvr::HalFunction(TInt aGroup, TInt aFunction, TAny* a1, TAny* a2)
  5823 	{
  5824 
  5825 	return Exec::HalFunction(aGroup, aFunction, a1, a2);
  5826 	}
  5827 
  5828 EXPORT_C TInt UserSvr::HalFunction(TInt aGroup, TInt aFunction, TAny* a1, TAny* a2, TInt aDeviceNumber)
  5829 	{
  5830 
  5831 	return Exec::HalFunction(aGroup | (aDeviceNumber<<16), aFunction, a1, a2);
  5832 	}
  5833 
  5834 /**
  5835 @capability WriteDeviceData
  5836 */
  5837 EXPORT_C TInt UserSvr::SetMemoryThresholds(TInt aLowThreshold, TInt aGoodThreshold)
  5838 	{
  5839 	return Exec::SetMemoryThresholds(aLowThreshold,aGoodThreshold);
  5840 	}
  5841 
  5842 /**
  5843 @deprecated
  5844 @internalAll
  5845 @return EFalse
  5846 */
  5847 EXPORT_C TBool UserSvr::IpcV1Available()
  5848 	{
  5849 	return EFalse;
  5850 	}
  5851 
  5852 
  5853 
  5854 EXPORT_C void User::SetDebugMask(TUint32 aVal)
  5855 /**
  5856 Sets the debug mask.
  5857 
  5858 @param aVal A set of bit values as defined in nk_trace.h
  5859 */
  5860 	{
  5861 	Exec::SetDebugMask(aVal);
  5862 	}
  5863 
  5864 EXPORT_C void User::SetDebugMask(TUint32 aVal, TUint aIndex)
  5865 /**
  5866 Sets the debug mask at the given index
  5867 
  5868 @param aVal A set of bit values as defined in nk_trace.h
  5869 @param aIndex An index of which 32 bit mask word is to be accessed
  5870 */
  5871 	{
  5872 	Exec::SetDebugMaskIndex(aVal, aIndex);
  5873 	}
  5874 
  5875 
  5876 /**
  5877 Gets machine information.
  5878 
  5879 @publishedPartner
  5880 @deprecated Use HAL::Get() from the HAL library instead.
  5881 */
  5882 EXPORT_C TInt UserHal::MachineInfo(TDes8& anInfo)
  5883     {
  5884 	TInt bufLength=anInfo.MaxLength();
  5885 	__ASSERT_ALWAYS(bufLength==sizeof(TMachineInfoV2) || bufLength==sizeof(TMachineInfoV1),Panic(ETDes8BadDescriptorType));
  5886 
  5887 	// assemble a TMachineInfoV1 buffer
  5888 	TMachineInfoV2* info=&((TMachineInfoV2Buf&)anInfo)();
  5889 	// Variant stuff
  5890 	TVariantInfoV01Buf infoBuf;
  5891 	TInt r = Exec::HalFunction(EHalGroupVariant, EVariantHalVariantInfo, (TAny*)&infoBuf, NULL);
  5892 	if (KErrNone != r) return r;			// must always be implemented!
  5893 	TVariantInfoV01& variantInfo = infoBuf();
  5894 
  5895 	info->iRomVersion=variantInfo.iRomVersion;
  5896 	info->iMachineUniqueId=variantInfo.iMachineUniqueId;
  5897 	info->iLedCapabilities=variantInfo.iLedCapabilities;
  5898 	info->iProcessorClockInKHz=variantInfo.iProcessorClockInKHz;
  5899 	info->iSpeedFactor=variantInfo.iSpeedFactor;
  5900 
  5901 	// Video driver stuff
  5902 	TVideoInfoV01Buf vidinfoBuf;
  5903 	r = Exec::HalFunction(EHalGroupDisplay, EDisplayHalCurrentModeInfo, (TAny*)&vidinfoBuf, NULL);
  5904 	if (KErrNone == r)
  5905 		{
  5906 		TVideoInfoV01& vidinfo = vidinfoBuf();
  5907 		info->iDisplaySizeInPixels=vidinfo.iSizeInPixels;
  5908 		info->iPhysicalScreenSize=vidinfo.iSizeInTwips;
  5909 		}
  5910 	else								// no display driver
  5911 		{
  5912 		info->iDisplaySizeInPixels.iWidth=0;
  5913 		info->iDisplaySizeInPixels.iHeight=0;
  5914 		info->iPhysicalScreenSize.iWidth=0;
  5915 		info->iPhysicalScreenSize.iHeight=0;
  5916 		}
  5917 	TInt colors = 0;
  5918 	r = Exec::HalFunction(EHalGroupDisplay, EDisplayHalColors, &colors, NULL);
  5919 	info->iMaximumDisplayColors=(KErrNone == r)?colors:0;
  5920 	TInt val;
  5921 	info->iBacklightPresent= (KErrNone == Exec::HalFunction(EHalGroupDisplay, EDisplayHalBacklightOn, &val, NULL));
  5922 
  5923 	// Pointing device stuff
  5924 	TDigitiserInfoV01Buf xyinfoBuf;
  5925 	r = Exec::HalFunction(EHalGroupDigitiser, EDigitiserHalXYInfo, (TAny*)&xyinfoBuf, NULL);
  5926 	if (KErrNone == r)
  5927 		{
  5928 		info->iXYInputType=EXYInputPointer;					// XY is Digitiser
  5929 		TDigitiserInfoV01& xyinfo = xyinfoBuf();
  5930 		info->iXYInputSizeInPixels=xyinfo.iDigitiserSize;
  5931 		info->iOffsetToDisplayInPixels=xyinfo.iOffsetToDisplay;
  5932 		}
  5933 	else
  5934 		{
  5935 		TMouseInfoV01Buf mouseinfoBuf;
  5936 		r = Exec::HalFunction(EHalGroupMouse, EMouseHalMouseInfo, (TAny*)&mouseinfoBuf, NULL);
  5937 		if (KErrNone == r)
  5938 			{
  5939 			info->iXYInputType=EXYInputMouse;				// XY is Mouse
  5940 			TMouseInfoV01& mouseinfo = mouseinfoBuf();
  5941 			info->iXYInputSizeInPixels=mouseinfo.iMouseAreaSize;
  5942 			info->iOffsetToDisplayInPixels=mouseinfo.iOffsetToDisplay;
  5943 			}
  5944 		else
  5945 			{
  5946 			info->iXYInputType=EXYInputNone;				// no XY
  5947 			info->iXYInputSizeInPixels.iWidth=0;
  5948 			info->iXYInputSizeInPixels.iHeight=0;
  5949 			info->iOffsetToDisplayInPixels.iX=0;
  5950 			info->iOffsetToDisplayInPixels.iY=0;
  5951 			}
  5952 		}
  5953 
  5954 	// Keyboard stuff
  5955 	TKeyboardInfoV01Buf kbdinfoBuf;
  5956 	info->iKeyboardPresent= (KErrNone == Exec::HalFunction(EHalGroupKeyboard, EKeyboardHalKeyboardInfo, (TAny*)&kbdinfoBuf, NULL));
  5957 
  5958 	// Unused, obsolete parameters
  5959 	info->iKeyboardId=0;
  5960 	info->iDisplayId=0;
  5961 	if(bufLength==sizeof(TMachineInfoV2))
  5962 		{
  5963 		// assemble a TMachineInfoV2 buffer
  5964 		info->iLanguageIndex=0;
  5965 		info->iKeyboardIndex=0;
  5966 		}
  5967 
  5968 	anInfo.SetLength(bufLength);
  5969 
  5970     return KErrNone;
  5971     }
  5972 
  5973 /**
  5974 Gets memory information.
  5975 
  5976 @see HAL::Get()
  5977 
  5978 @publishedPartner
  5979 @deprecated Use HAL::Get() from the HAL library instead with attributes EMemoryRAM, EMemoryRAMFree or EMemoryROM.
  5980 */
  5981 EXPORT_C TInt UserHal::MemoryInfo(TDes8& anInfo)
  5982     {
  5983     return Exec::HalFunction(EHalGroupKernel,EKernelHalMemoryInfo,(TAny*)&anInfo,NULL);
  5984     }
  5985 
  5986 /**
  5987 Gets ROM configuration information.
  5988 
  5989 @publishedPartner
  5990 @deprecated No replacement.
  5991 */
  5992 EXPORT_C TInt UserHal::RomInfo(TDes8& anInfo)
  5993     {
  5994     return Exec::HalFunction(EHalGroupKernel,EKernelHalRomInfo,(TAny*)&anInfo,NULL);
  5995     }
  5996 
  5997 
  5998 
  5999 
  6000 /**
  6001 Gets drive information.
  6002 
  6003 @param anInfo A package buffer (TPckgBuf) containing a TDriveInfoV1 structure.
  6004               On return, this structure will contain the drive information.
  6005 	
  6006 @return KErrNone 
  6007 
  6008 @see TDriveInfoV1Buf
  6009 @see TDriveInfoV1
  6010 @see TPckgBuf
  6011 */
  6012 EXPORT_C TInt UserHal::DriveInfo(TDes8& anInfo)
  6013     {
  6014 	TDriveInfoV1Buf8 anInfo8;
  6015     TInt r = Exec::HalFunction(EHalGroupMedia,EMediaHalDriveInfo,(TAny*)&anInfo8,NULL);
  6016 	TDriveInfoV18& driveInfo8 = anInfo8();
  6017 	TDriveInfoV1* driveInfo = NULL;
  6018 	switch(((SBuf8*)&anInfo)->length>>KShiftDesType8) //type
  6019 		{
  6020 		case EPtr:
  6021 			 driveInfo = &((TPckg<TDriveInfoV1>&)anInfo)();
  6022 			 break;
  6023 		case EBuf:		
  6024 			 driveInfo = &((TDriveInfoV1Buf&)anInfo)();
  6025 			 break;
  6026 		default:
  6027 			__ASSERT_ALWAYS(EFalse,Panic(ETDes8BadDescriptorType));
  6028 		}
  6029 
  6030 	// A compile time assert to make sure that this function is examined if TDriveInfoV1
  6031 	// structure changes
  6032 	extern int TDriveInfoV1_structure_assert[(
  6033 		_FOFF(TDriveInfoV1,iRegisteredDriveBitmask)+4 == sizeof(TDriveInfoV1)
  6034 		&&
  6035 		sizeof(TDriveInfoV1) == 816
  6036 		)?1:-1];
  6037 	(void)TDriveInfoV1_structure_assert;
  6038 
  6039 	// Set length to size of old EKA1 TDriveInfoV1 (Will Panic if not big enough)
  6040 	TInt len = (TUint)_FOFF(TDriveInfoV1,iRegisteredDriveBitmask);
  6041 	anInfo.SetLength(len);
  6042 
  6043 	// Fill in info for old EKA1 TDriveInfoV1
  6044 	driveInfo->iTotalSupportedDrives = driveInfo8.iTotalSupportedDrives;
  6045 	driveInfo->iTotalSockets = driveInfo8.iTotalSockets;
  6046 	driveInfo->iRuggedFileSystem = driveInfo8.iRuggedFileSystem;
  6047 	TInt index;
  6048 	for(index=0;index<KMaxLocalDrives;index++)
  6049 		driveInfo->iDriveName[index].Copy(driveInfo8.iDriveName[index]);
  6050 	for(index=0;index<KMaxPBusSockets;index++)
  6051 		driveInfo->iSocketName[index].Copy(driveInfo8.iSocketName[index]);
  6052 
  6053 	// If anInfo is big enough then set new EKA2 members of TDriveInfoV1
  6054 	if((TUint)anInfo.MaxLength()>=(TUint)sizeof(TDriveInfoV1))
  6055 		{
  6056 		anInfo.SetLength(sizeof(TDriveInfoV1));
  6057 		driveInfo->iRegisteredDriveBitmask = driveInfo8.iRegisteredDriveBitmask;
  6058 		}
  6059 	return r;
  6060     }
  6061 
  6062 
  6063 
  6064 
  6065 /**
  6066 Gets the startup reason.
  6067 
  6068 @see HAL::Get() 
  6069 
  6070 @publishedPartner
  6071 @deprecated Use HAL::Get() from the HAL library instead with attributes ESystemStartupReason.
  6072 */
  6073 EXPORT_C TInt UserHal::StartupReason(TMachineStartupType& aReason)
  6074     {
  6075     return Exec::HalFunction(EHalGroupKernel,EKernelHalStartupReason,(TAny*)&aReason,NULL);
  6076     }
  6077 
  6078 
  6079 
  6080 
  6081 /**
  6082 Gets the reason why the kernel last faulted.
  6083 
  6084 @param aReason An integer that, on return, contains the reason code describing
  6085                why the kernel faulted. This is the fault number passed 
  6086                in a call to Kern::Fault().
  6087 
  6088 @return KErrNone
  6089 
  6090 @see Kern::Fault()
  6091 */
  6092 EXPORT_C TInt UserHal::FaultReason(TInt &aReason)
  6093 	{
  6094 
  6095 	return Exec::HalFunction(EHalGroupKernel,EKernelHalFaultReason,(TAny *)&aReason,NULL);
  6096 	}
  6097 
  6098 
  6099 
  6100 
  6101 /**
  6102 Gets the exception Id that describes the type of fault when
  6103 the kernel last faulted.
  6104 
  6105 The Id is the value contained in TArmExcInfo::iExcCode.
  6106  
  6107 @param anId An integer that, on return, contains the exception Id.
  6108 
  6109 @return KErrNone
  6110 
  6111 @see TArmExcInfo::iExcCode
  6112 @see TArmExcInfo
  6113 */
  6114 EXPORT_C TInt UserHal::ExceptionId(TInt &anId)
  6115 	{
  6116 
  6117 	return Exec::HalFunction(EHalGroupKernel,EKernelHalExceptionId, (TAny *)&anId, NULL);
  6118 	}
  6119 
  6120 
  6121 
  6122 /**
  6123 Gets the available exception information that describes the last kernel fault.
  6124 
  6125 @param aInfo A TExcInfo structure that, on return, contains the available
  6126              exception information.
  6127              
  6128 @return KErrNone
  6129 
  6130 @see TExcInfo        
  6131 */
  6132 EXPORT_C TInt UserHal::ExceptionInfo(TExcInfo &aInfo)
  6133 	{
  6134 
  6135 	return Exec::HalFunction(EHalGroupKernel,EKernelHalExceptionInfo, (TAny *)&aInfo, NULL);
  6136 	}
  6137 
  6138 
  6139 
  6140 
  6141 /**
  6142 Gets the page size for this device.
  6143 
  6144 @param anId An integer that, on return, contains the page size, in bytes,
  6145             for this device.
  6146 
  6147 @return KErrNone
  6148 */
  6149 EXPORT_C TInt UserHal::PageSizeInBytes(TInt& aSize)
  6150     {
  6151 
  6152     return Exec::HalFunction(EHalGroupKernel,EKernelHalPageSizeInBytes,(TAny*)&aSize,NULL);
  6153     }
  6154 
  6155 
  6156 
  6157 
  6158 /**
  6159 Switches the  device off.
  6160 
  6161 @return KErrNone, if successful; KErrPermissionDenied, if the calling process
  6162         has insufficient capability.
  6163 
  6164 @capability PowerMgmt
  6165 */
  6166 EXPORT_C TInt UserHal::SwitchOff()
  6167     {
  6168 	if(!RProcess().HasCapability(ECapabilityPowerMgmt,__PLATSEC_DIAGNOSTIC_STRING("Checked by UserHal::SwitchOff")))
  6169 		return KErrPermissionDenied;
  6170 	TInt r = Power::EnableWakeupEvents(EPwStandby);
  6171 	if(r!=KErrNone)
  6172 		return r;
  6173 	TRequestStatus s;
  6174 	Power::RequestWakeupEventNotification(s);
  6175 	Power::PowerDown();
  6176 	User::WaitForRequest(s);
  6177 	return s.Int();
  6178 //	return Exec::HalFunction(EHalGroupPower,EPowerHalSwitchOff,NULL,NULL);
  6179 	}
  6180 
  6181 
  6182 
  6183 
  6184 /**
  6185 Sets the calibration data for the digitiser (i.e. XY) input device.
  6186 
  6187 @param aCalibration The calibration data.
  6188 
  6189 @return KErrNone, if successful; KErrPermissionDenied, if the calling process
  6190         has insufficient capability.
  6191 
  6192 @see TDigitizerCalibration
  6193 
  6194 @capability WriteDeviceData
  6195 */
  6196 EXPORT_C TInt UserHal::SetXYInputCalibration(const TDigitizerCalibration& aCalibration)
  6197     {
  6198     return Exec::HalFunction(EHalGroupDigitiser,EDigitiserHalSetXYInputCalibration,(TAny*)&aCalibration,NULL);
  6199     }
  6200 
  6201 
  6202 
  6203 
  6204 /**
  6205 Gets the points on the display that the user should point to in order
  6206 to calibrate the digitiser (i.e. XY) input device.
  6207 
  6208 @param aCalibration A TDigitizerCalibration object that, on return, contains
  6209        the appropriate information.
  6210        
  6211 @return KerrNone, if successful; otherwise one of the other system wide
  6212         error codes. 
  6213 */
  6214 EXPORT_C TInt UserHal::CalibrationPoints(TDigitizerCalibration& aCalibration)
  6215     {
  6216 
  6217     return Exec::HalFunction(EHalGroupDigitiser,EDigitiserHalCalibrationPoints,(TAny*)&aCalibration,NULL);
  6218     }
  6219 
  6220 
  6221 
  6222 
  6223 /**
  6224 Gets the platform tick period.
  6225 
  6226 @param aTime The tick period in microseconds.
  6227 
  6228 @return KErrNone, if successful; otherwise one of the other system wide
  6229         error codes.
  6230 */
  6231 EXPORT_C TInt UserHal::TickPeriod(TTimeIntervalMicroSeconds32 &aTime)
  6232     {
  6233 
  6234     return Exec::HalFunction(EHalGroupKernel,EKernelHalTickPeriod,(TAny*)&aTime,NULL);
  6235     }
  6236 
  6237 
  6238 
  6239 /**
  6240 Saves the current digitiser (i.e. XY) input device calibration data.
  6241 
  6242 @return KErrNone, if successful; otherwise one of the other system wide
  6243         error codes, e.g. KErrNotSupported.
  6244 */
  6245 EXPORT_C TInt UserHal::SaveXYInputCalibration()
  6246     {
  6247 
  6248     return Exec::HalFunction(EHalGroupDigitiser,EDigitiserHalSaveXYInputCalibration,NULL,NULL);
  6249     }
  6250 
  6251 
  6252 
  6253 
  6254 /**
  6255 Restores the digitiser (i.e. XY) input device calibration data.
  6256 
  6257 @param aType A TDigitizerCalibration object that, on return, contains
  6258        the calibration data.
  6259 
  6260 @return KErrNone, if successful; KErrPermissionDenied, if the calling process
  6261         has insufficient capability; otherwise one of the other system wide
  6262         error codes, e.g. KErrNotSupported.
  6263 
  6264 @capability WriteDeviceData
  6265 */
  6266 EXPORT_C TInt UserHal::RestoreXYInputCalibration(TDigitizerCalibrationType aType)
  6267     {
  6268     return Exec::HalFunction(EHalGroupDigitiser,EDigitiserHalRestoreXYInputCalibration,(TAny*)aType,NULL);
  6269 	}
  6270 
  6271 
  6272 
  6273 
  6274 /**
  6275 Gets the machine configuration.
  6276 
  6277 @param aConfig On return contains the machine configuration data.
  6278 @param aSize   On return, contains the size of the data.
  6279 
  6280 @return KErrNone, if sucessful, otherwise one of the other system-wide
  6281         error codes.
  6282 
  6283 @capability ReadDeviceData
  6284 */
  6285 EXPORT_C TInt User::MachineConfiguration(TDes8& aConfig,TInt& aSize)
  6286     {
  6287 	return(Exec::MachineConfiguration(aConfig,aSize));
  6288     }
  6289 
  6290 
  6291 
  6292 
  6293 EXPORT_C TInt RDebug::Print(TRefByValue<const TDesC> aFmt,...)
  6294 //
  6295 // Print to the comms port
  6296 //
  6297     {
  6298 
  6299 	TestOverflowTruncate overflow;
  6300 	// coverity[var_decl]
  6301 	VA_LIST list;
  6302 	VA_START(list,aFmt);
  6303 	TBuf<0x100> buf;
  6304 	// coverity[uninit_use_in_call]
  6305 	TRAP_IGNORE(buf.AppendFormatList(aFmt,list,&overflow)); // ignore leave in TTimeOverflowLeave::Overflow()
  6306 #ifdef _UNICODE
  6307 	TPtr8 p(buf.Collapse());
  6308 	Exec::DebugPrint((TAny*)&p, 0);
  6309 #else
  6310 	Exec::DebugPrint((TAny*)&buf, 0);
  6311 #endif
  6312 	return 0;
  6313     }
  6314 
  6315 class TestOverflowTruncate8 : public TDes8Overflow
  6316 	{
  6317 public:
  6318 	virtual void Overflow(TDes8& /*aDes*/) {}
  6319 	};
  6320 
  6321 EXPORT_C void RDebug::Printf(const char* aFmt, ...)
  6322 //
  6323 // Print to the comms port
  6324 //
  6325     {
  6326 
  6327 	TestOverflowTruncate8 overflow;
  6328 	// coverity[var_decl]
  6329 	VA_LIST list;
  6330 	VA_START(list,aFmt);
  6331 	TPtrC8 fmt((const TText8*)aFmt);
  6332 	TBuf8<0x100> buf;
  6333 	// coverity[uninit_use_in_call]
  6334 	TRAP_IGNORE(buf.AppendFormatList(fmt,list,&overflow));	
  6335 	Exec::DebugPrint((TAny*)&buf, 0);
  6336     }
  6337 
  6338 EXPORT_C void RDebug::RawPrint(const TDesC8& aDes)
  6339 	{
  6340 	Exec::DebugPrint((TAny*)&aDes, 1);
  6341 	}
  6342 
  6343 EXPORT_C void RDebug::RawPrint(const TDesC16& aDes)
  6344 //
  6345 // Print to the comms port
  6346 //
  6347     {
  6348 	TBuf8<0x100> aDes8;
  6349 	if(aDes.Length()>0x100)
  6350 		{
  6351 		TPtrC ptr(aDes.Ptr(), 0x100);
  6352 		aDes8.Copy(ptr);
  6353 		}
  6354 	else
  6355 		aDes8.Copy(aDes);
  6356 	Exec::DebugPrint((TAny*)&aDes8, 1);
  6357 	}
  6358 
  6359 EXPORT_C TUint32 Math::Random()
  6360 /**
  6361 Gets 32 random bits from the kernel's random pool.
  6362 
  6363 @return The 32 random bits.
  6364 */
  6365 	{
  6366 
  6367 	return Exec::MathRandom();
  6368 	}
  6369 
  6370 
  6371 
  6372 EXPORT_C void User::IMB_Range(TAny* aStart, TAny* aEnd)
  6373 /**
  6374 Does the necessary preparations to guarantee correct execution of code in the 
  6375 specified virtual address range.
  6376 
  6377 The function assumes that this code has been loaded or modified by user code.
  6378 Calling this function against uncommitted memory region is considered as S/W
  6379 bug and may generate exception on some memory models.
  6380 
  6381 The specified addresses are associated with a user writable code chunk as 
  6382 created by RChunk::CreateLocalCode().
  6383 
  6384 The function cleans the data cache to ensure that written data has been
  6385 committed to main memory and then flushes the instruction cache and branch
  6386 target buffer (BTB) to ensure that the code is loaded from main memory when
  6387 it is executed. 
  6388 The Kernel uses the size of the range specified to decide whether to clean/flush 
  6389 line-by-line or to simply clean/flush the entire cache.
  6390 
  6391 @param aStart The start virtual address of the region.
  6392 @param aEnd   The end virtual address of the region. This location is not within 
  6393               the region.
  6394               
  6395 @see RChunk::CreateLocalCode()
  6396 @see UserHeap::ChunkHeap()
  6397 */
  6398 	{
  6399 
  6400 	Exec::IMB_Range(aStart,(TUint32)aEnd-(TUint32)aStart);
  6401 	}
  6402 
  6403 
  6404 
  6405 
  6406 /**
  6407 Sets the specified handle into the specified environment data slot
  6408 for this process.
  6409 
  6410 The APPARC framework (class CApaApplication etc.) uses some of the slots internally,
  6411 so programs that use this framework should ensure that they only use slots available
  6412 for public use.
  6413 
  6414 @param aSlot   An index that identifies the environment data slot.
  6415                This is a value relative to zero;
  6416                i.e. 0 is the first item/slot.
  6417                This can range from 0 to 15.
  6418 @param aHandle The handle to be passed to this process.
  6419 
  6420 @return KErrNone, always.
  6421 
  6422 @panic KERN-EXEC 46 if this function is called by a thread running
  6423                     in a process that is not the creator of this process, or
  6424                     the handle is not local.
  6425 @panic KERN-EXEC 51 if aSlot is negative or is greater than or equal to
  6426                     the value of KArgIndex. 
  6427 @panic KERN-EXEC 52 if the specified slot is already in use.
  6428 
  6429 @see CApaApplication
  6430 @see CApaCommandLine::EnvironmentSlotForPublicUse()
  6431 */
  6432 EXPORT_C TInt RProcess::SetParameter(TInt aSlot, RHandleBase aHandle)
  6433 	{
  6434 	return Exec::ProcessSetHandleParameter(iHandle, aSlot, aHandle.Handle());
  6435 	}
  6436 
  6437 
  6438 
  6439 
  6440 /**
  6441 Sets the specified 16-bit descriptor data into the specified environment
  6442 data slot for this process.
  6443 
  6444 The APPARC framework (class CApaApplication etc.) uses some of the slots internally,
  6445 so programs that use this framework should ensure that they only use slots available
  6446 for public use.
  6447 
  6448 @param aSlot   An index that identifies the environment data slot.
  6449                This is a value relative to zero;
  6450                i.e. 0 is the first item/slot.
  6451                This can range from 0 to 15.
  6452 @param aDes    The 16-bit descriptor containing data be passed to this process.
  6453 
  6454 @return KErrNone, if successful, otherwise one of the other system
  6455         wide error codes.
  6456 
  6457 @panic KERN-EXEC 46 if this function is called by a thread running
  6458                     in a process that is not the creator of this process.
  6459 @panic KERN-EXEC 51 if aSlot is negative or is greater than or equal to
  6460                     the value of KArgIndex. 
  6461 @panic KERN-EXEC 52 if the specified slot is already in use.
  6462 @panic KERN-EXEC 53 if the length of data passed is negative.
  6463 
  6464 @see CApaApplication
  6465 @see CApaCommandLine::EnvironmentSlotForPublicUse()
  6466 */
  6467 EXPORT_C TInt RProcess::SetParameter(TInt aSlot, const TDesC16& aDes)
  6468 	{
  6469 	return Exec::ProcessSetDataParameter(iHandle, aSlot, (const TUint8*)aDes.Ptr(), 2*aDes.Length());
  6470 	}
  6471 
  6472 
  6473 
  6474 
  6475 /**
  6476 Sets the specified 8-bit descriptor data into the specified environment
  6477 data slot for this process.
  6478 
  6479 The APPARC framework (class CApaApplication etc.) uses some of the slots internally,
  6480 so programs that use this framework should ensure that they only use slots available
  6481 for public use.
  6482 
  6483 @param aSlot   An index that identifies the environment data slot.
  6484                This is a value relative to zero;
  6485                i.e. 0 is the first item/slot.
  6486                This can range from 0 to 15.
  6487 @param aDes    The 8-bit descriptor containing data be passed to this process.
  6488 
  6489 @return KErrNone, if successful, otherwise one of the other system
  6490         wide error codes.
  6491 
  6492 @panic KERN-EXEC 46 if this function is called by a thread running
  6493                     in a process that is not the creator of this process.
  6494 @panic KERN-EXEC 51 if aSlot is negative or is greater than or equal to
  6495                     the value of KArgIndex. 
  6496 @panic KERN-EXEC 52 if the specified slot is already in use.
  6497 @panic KERN-EXEC 53 if the length of data passed is negative.
  6498 
  6499 @see CApaApplication
  6500 @see CApaCommandLine::EnvironmentSlotForPublicUse()
  6501 */
  6502 EXPORT_C TInt RProcess::SetParameter(TInt aSlot, const TDesC8& aDes)
  6503 	{
  6504 	return Exec::ProcessSetDataParameter(iHandle, aSlot, aDes.Ptr(), aDes.Length());
  6505 	}
  6506 
  6507 
  6508 
  6509 
  6510 /**
  6511 Sets the specfied sub-session into the specified environment
  6512 data slot for this process.
  6513 
  6514 The APPARC framework (class CApaApplication etc.) uses some of the slots internally,
  6515 so programs that use this framework should ensure that they only use slots available
  6516 for public use.
  6517 
  6518 @param aSlot    An index that identifies the environment data slot.
  6519                 This is a value relative to zero;
  6520                 i.e. 0 is the first item/slot.
  6521                 This can range from 0 to 15.
  6522 @param aSession The sub-session.
  6523 
  6524 @return KErrNone, if successful, otherwise one of the other system
  6525         wide error codes.
  6526 
  6527 @panic KERN-EXEC 46 if this function is called by a thread running
  6528                     in a process that is not the creator of this process.
  6529 @panic KERN-EXEC 51 if aSlot is negative or is greater than or equal to
  6530                     the value of KArgIndex. 
  6531 @panic KERN-EXEC 52 if the specified slot is already in use.
  6532 @panic KERN-EXEC 53 if the length of data passed is negative.
  6533 
  6534 @see CApaApplication
  6535 @see CApaCommandLine::EnvironmentSlotForPublicUse()
  6536 */
  6537 EXPORT_C TInt RProcess::SetParameter(TInt aSlot, const RSubSessionBase& aSession)
  6538 	{
  6539 	TInt handle = aSession.SubSessionHandle();
  6540 	return Exec::ProcessSetDataParameter(iHandle, aSlot, (const TUint8*)&handle, sizeof(handle));
  6541 	}
  6542 
  6543 
  6544 
  6545 
  6546 /**
  6547 Sets the specfied integer value into the specified environment
  6548 data slot for this process.
  6549 
  6550 The APPARC framework (class CApaApplication etc.) uses some of the slots internally,
  6551 so programs that use this framework should ensure that they only use slots available
  6552 for public use.
  6553 
  6554 @param aSlot   An index that identifies the environment data slot.
  6555                This is a value relative to zero;
  6556                i.e. 0 is the first item/slot.
  6557                This can range from 0 to 15.
  6558 @param aData   The integer value.
  6559 
  6560 @return KErrNone, if successful, otherwise one of the other system
  6561         wide error codes.
  6562 
  6563 @panic KERN-EXEC 46 if this function is called by a thread running
  6564                     in a process that is not the creator of this process.
  6565 @panic KERN-EXEC 51 if aSlot is negative or is greater than or equal to
  6566                     the value of KArgIndex. 
  6567 @panic KERN-EXEC 52 if the specified slot is already in use.
  6568 @panic KERN-EXEC 53 if the length of data passed is negative.
  6569 
  6570 @see CApaApplication
  6571 @see CApaCommandLine::EnvironmentSlotForPublicUse()
  6572 */
  6573 EXPORT_C TInt RProcess::SetParameter(TInt aSlot, TInt aData)
  6574 	{
  6575 	return Exec::ProcessSetDataParameter(iHandle, aSlot, (TUint8*)&aData, sizeof(aData));
  6576 	}
  6577 
  6578 
  6579 
  6580 
  6581 EXPORT_C TInt User::GetTIntParameter(TInt aSlot,  TInt& aData)
  6582 /**
  6583 Gets the specified environment data item belonging to the
  6584 current process; this is assumed to be a 32 bit value.
  6585 
  6586 Environment data may be stored in the process and is passed to a child process
  6587 on creation of that child process.
  6588 
  6589 On successful return from this function, the data item is deleted from
  6590 the process. 
  6591 
  6592 @param aSlot An index that identifies the data item.
  6593              This is an index whose value is relative to zero;
  6594              i.e. 0 is the first item/slot.
  6595              This can range from 0 to 15, i.e. there are 16 slots. 
  6596 
  6597 @param aData On sucessful return, contains the environment data item.
  6598 
  6599 @return KErrNone, if successful;
  6600         KErrNotFound, if there is no data; 
  6601         KErrArgument, if the data is not binary data, or the data item in the
  6602                       process is longer than 32 bits.
  6603                       
  6604 @panic KERN-EXEC 51, if aSlot is negative or is greater than or equal to 16.                                   
  6605 */
  6606 	{
  6607 	TInt ret = Exec::ProcessGetDataParameter(aSlot, (TUint8*)&aData, sizeof(TInt));
  6608 	if (ret < 0)
  6609 		return ret;
  6610 	return KErrNone;
  6611 	}
  6612 
  6613 
  6614 
  6615 
  6616 EXPORT_C TInt User::ParameterLength(TInt aSlot)
  6617 /**
  6618 Gets the length of the specified item of environment data belonging to the
  6619 current process.
  6620 
  6621 Environment data may be stored in the process and is passed to a child process
  6622 on creation of that child process.
  6623 
  6624 @param aSlot An index that identifies the data item whose length is to be
  6625              retrieved. This is an index whose value is relative to zero;
  6626              i.e. 0 is the first item/slot.
  6627              This can range from 0 to 15, i.e. there are 16 slots.  
  6628              
  6629 @return KErrNotFound, if there is no data; 
  6630         KErrArgument, if the data is not binary data;
  6631         The length of the data item.
  6632              
  6633 @panic KERN-EXEC 51, if aSlot is negative or is greater than or equal to 16.             
  6634 */
  6635 	{
  6636 	TInt ret = Exec::ProcessDataParameterLength(aSlot);
  6637 	return ret;
  6638 	}
  6639 
  6640 
  6641 
  6642 
  6643 EXPORT_C TInt User::GetDesParameter(TInt aSlot, TDes8& aDes)
  6644 /**
  6645 Gets the specified environment data item belonging to the
  6646 current process; this is assumed to be an 8-bit descriptor.
  6647 
  6648 Environment data may be stored in the process and is passed to a child process
  6649 on creation of that child process.
  6650 
  6651 On successful return from this function, the data item is deleted from
  6652 the process. 
  6653 
  6654 @param aSlot An index that identifies the data item.
  6655              This is an index whose value is relative to zero;
  6656              i.e. 0 is the first item/slot.
  6657              This can range from 0 to 15, i.e. there are 16 slots. 
  6658 
  6659 @param aDes  On sucessful return, contains the environment data item; the
  6660              length of the descriptor is set to the length of the data item.
  6661 
  6662 @return KErrNone, if successful;
  6663         KErrNotFound, if there is no data; 
  6664         KErrArgument, if the data is not binary data, or the data item in the
  6665                       process is longer than the maximum length of aDes.
  6666                       
  6667 @panic KERN-EXEC 51, if aSlot is negative or is greater than or equal to 16.                                   
  6668 */
  6669 	{
  6670 	TInt ret = Exec::ProcessGetDataParameter(aSlot, (TUint8*)aDes.Ptr(), aDes.MaxLength());
  6671 	if (ret < 0)
  6672 		return ret;
  6673 	aDes.SetLength(ret);
  6674 	return KErrNone;
  6675 	}
  6676 
  6677 
  6678 
  6679 
  6680 EXPORT_C TInt User::GetDesParameter(TInt aSlot, TDes16& aDes)
  6681 /**
  6682 Gets the specified environment data item belonging to the
  6683 current process; this is assumed to be an 16-bit descriptor.
  6684 
  6685 Environment data may be stored in the process and is passed to a child process
  6686 on creation of that child process.
  6687 
  6688 On successful return from this function, the data item is deleted from
  6689 the process. 
  6690 
  6691 @param aSlot An index that identifies the data item.
  6692              This is an index whose value is relative to zero;
  6693              i.e. 0 is the first item/slot.
  6694              This can range from 0 to 15, i.e. there are 16 slots. 
  6695 
  6696 @param aDes  On sucessful return, contains the environment data item; the
  6697              length of the descriptor is set to the length of the data item.
  6698 
  6699 @return KErrNone, if successful;
  6700         KErrNotFound, if there is no data; 
  6701         KErrArgument, if the data is not binary data, or the data item in the
  6702                       process is longer than the maximum length of aDes.
  6703                       
  6704 @panic KERN-EXEC 51, if aSlot is negative or is greater than or equal to 16.                                   
  6705 */
  6706 	{
  6707 	TInt ret = Exec::ProcessGetDataParameter(aSlot, (TUint8*)aDes.Ptr(), 2*aDes.MaxLength());
  6708 	if (ret < 0)
  6709 		return ret;
  6710 	aDes.SetLength(ret/2);
  6711 	return KErrNone;
  6712 	}
  6713 
  6714 /**
  6715 Gets the linear address of the exception descriptor for the code module in which
  6716 a specified code address resides.
  6717 
  6718 @param	aCodeAddress The code address in question.
  6719 @return	The address of the exception descriptor, or zero if there is none.
  6720 
  6721 */
  6722 EXPORT_C TLinAddr UserSvr::ExceptionDescriptor(TLinAddr aCodeAddress)
  6723 	{
  6724 	return Exec::ExceptionDescriptor(aCodeAddress);
  6725 	}
  6726 
  6727 EXPORT_C TInt User::SetFloatingPointMode(TFloatingPointMode aMode, TFloatingPointRoundingMode aRoundingMode)
  6728 /**
  6729 Sets the hardware floating point mode for the current thread. This does not affect
  6730 software floating point calculations. The rounding mode can also be set. New threads created
  6731 by this thread will inherit the mode, thus to set the mode for a whole process, call this
  6732 method before you create any new threads.
  6733 
  6734 @param aMode         The floating point calculation mode to use.
  6735 @param aRoundingMode The floating point rounding mode to use, defaults to nearest.
  6736 
  6737 @return KErrNone if successful, KErrNotSupported if the hardware does not support the
  6738         chosen mode, or there is no floating point hardware present.
  6739 
  6740 @see TFloatingPointMode
  6741 @see TFloatingPointRoundingMode
  6742 */
  6743 	{
  6744 	return(Exec::SetFloatingPointMode(aMode, aRoundingMode));
  6745 	}
  6746 
  6747 
  6748 EXPORT_C TUint32 E32Loader::PagingPolicy()
  6749 /**
  6750 	Accessor function returns the code paging policy, as defined at ROM build time.
  6751 
  6752 	@return					Code paging policy only.  This function applies
  6753 							EKernelConfigCodePagingPolicyMask to the config flags
  6754 							before returning the value.
  6755  */
  6756 	{
  6757 	return Exec::KernelConfigFlags() & EKernelConfigCodePagingPolicyMask;
  6758 	}
  6759 
  6760 
  6761 /** Queue a notifier to detect system idle
  6762 
  6763 @internalTechnology
  6764 @prototype
  6765 */
  6766 EXPORT_C void User::NotifyOnIdle(TRequestStatus& aStatus)
  6767 	{
  6768 	aStatus = KRequestPending;
  6769 	Exec::NotifyOnIdle(&aStatus);
  6770 	}
  6771 
  6772 
  6773 /** Cancel a miscellaneous notification requested by this thread
  6774 
  6775 Cancels a currently outstanding notification for system idle or object
  6776 deletion.
  6777 
  6778 @internalTechnology
  6779 @prototype
  6780 */
  6781 EXPORT_C void User::CancelMiscNotifier(TRequestStatus& aStatus)
  6782 	{
  6783 	Exec::CancelMiscNotifier(&aStatus);
  6784 	}
  6785 
  6786 
  6787 /** Queue a notifier to detect destruction of this object
  6788 
  6789 To cancel the notifier, use User::CancelMiscNotifier().
  6790 
  6791 @internalTechnology
  6792 @prototype
  6793 */
  6794 EXPORT_C void RHandleBase::NotifyDestruction(TRequestStatus& aStatus)
  6795 	{
  6796 	aStatus = KRequestPending;
  6797 	Exec::NotifyObjectDestruction(iHandle, &aStatus);
  6798 	}
  6799