localisation/apparchitecture/apgrfx/APGWGNAM.CPP
branchSymbian2
changeset 1 8758140453c0
child 6 c108117318cb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/localisation/apparchitecture/apgrfx/APGWGNAM.CPP	Thu Jan 21 12:53:44 2010 +0000
@@ -0,0 +1,674 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include "APGWGNAM.H"
+#include "APGSTD.H"
+#include "APGTASK.H"
+
+const TInt KUidBufLength=8;
+const TInt KMinWindowGroupNameLength=5/*delimiters+status)*/+KUidBufLength;
+const TInt KMaxWindowGroupNameLength=KMinWindowGroupNameLength+2*KMaxFileName;
+const TInt KMaxSearchStringLength=KMaxFileName+6/* 3*delim+3*wild */;
+typedef TBuf<KMaxSearchStringLength> TApaSearchString;
+
+_LIT(KDefaultWindowGroupName,"00\x00\x30\x30\x30\x30\x30\x30\x30\x30\x0\x0");
+_LIT(KSearchAnyFile,"*");
+_LIT(KFormatStatus,"%02x");
+
+EXPORT_C CApaWindowGroupName::~CApaWindowGroupName()
+/** Destructor.
+
+Frees resources owned by the object prior to its destruction. */
+	{	   
+	delete iBuf;
+	}
+
+EXPORT_C CApaWindowGroupName* CApaWindowGroupName::New(const RWsSession& aWsSession, HBufC* aWgName)
+	//
+	// non leaving static initializer from full name - takes ownership
+	// ONLY TO BE USED WITH A VALID (i.e existing) WINDOW GROUP NAME
+	//
+/** Creates a window group name object and takes ownership of the heap descriptor 
+containing a name.
+
+The name must have valid format. Typically, this is an existing window group 
+name.
+
+Note that the function cannot leave.
+
+@param aWsSession A window server session.
+@param aWgName A heap descriptor containing a valid window group name. This 
+pointer must not be null, otherwise the function raises an APGRFX 3 panic.
+@return A pointer to the new window group name object. */
+	{
+	CApaWindowGroupName* This=NULL;
+	if (aWgName)
+		{
+		This=new CApaWindowGroupName(aWsSession);
+		if (This)
+			{
+			This->iBuf=aWgName;
+			This->GetStatusFromName();
+			}
+		}
+	else
+		Panic(EPanicNullWindowGroupName);
+	return This;
+	}
+
+EXPORT_C CApaWindowGroupName* CApaWindowGroupName::NewL(const RWsSession& aWsSession)
+	//
+	// static initializer for blank window group name
+	//
+/** Creates a window group name object and assigns a default name to it.
+
+@param aWsSession A window server session.
+@return A pointer to the new window group name object. */
+	{
+	CApaWindowGroupName* This=NewLC(aWsSession);
+	CleanupStack::Pop();
+	return This;
+	}
+
+EXPORT_C CApaWindowGroupName* CApaWindowGroupName::NewL(const RWsSession& aWsSession, TInt aWgId)
+	//
+	// static initializer for existing window group name given by aWgId
+	//
+/** Creates a window group name object and assigns to it the name taken from the 
+specified window group.
+
+@param aWsSession A window server session.
+@param aWgId The ID of a window group.
+@return A pointer to the new window group name object. */
+	{
+	CApaWindowGroupName* This=NewLC(aWsSession, aWgId);
+	CleanupStack::Pop();
+	return This;
+	}
+
+EXPORT_C CApaWindowGroupName* CApaWindowGroupName::NewL(const RWsSession& aWsSession, const TDesC& aWgName)
+	//
+	// static initializer from full name
+	// ONLY TO BE USED WITH A VALID (i.e existing) WINDOW GROUP NAME
+	//
+/** Creates a window group name object and assigns to it the specified name.
+
+The name must have a valid format. Typically, this is an existing window group 
+name.
+
+@param aWsSession A window server session.
+@param aWgName A valid window group name.
+@return A pointer to the new window group name object. */
+	{
+	CApaWindowGroupName* This=NewLC(aWsSession, aWgName);
+	CleanupStack::Pop();
+	return This;
+	}
+
+EXPORT_C CApaWindowGroupName* CApaWindowGroupName::NewLC(const RWsSession& aWsSession)
+	//
+	// static initializer for blank window group name
+	//
+/** Creates a window group name object, assigns a default name to it, and puts 
+a pointer to the new object onto the cleanup stack.
+
+@param aWsSession A window server session. 
+@return A pointer to the new window group name object. */
+	{
+	CApaWindowGroupName* This=new(ELeave) CApaWindowGroupName(aWsSession);
+	CleanupStack::PushL(This);
+	This->DefaultConstructL();
+	return This;
+	}
+
+EXPORT_C CApaWindowGroupName* CApaWindowGroupName::NewLC(const RWsSession& aWsSession, TInt aWgId)
+	//
+	// static initializer for existing window group name given by aWgId
+	//
+/** Creates a window group name object, assigns to it the name taken from the specified 
+window group, and puts a pointer to the new object onto the cleanup stack.
+
+@param aWsSession A window server session.
+@param aWgId The ID of a window group.
+@return A pointer to the new window group name object. */
+	{
+	CApaWindowGroupName* This=new(ELeave) CApaWindowGroupName(aWsSession);
+	CleanupStack::PushL(This);
+	This->ConstructFromWgIdL(aWgId);
+	return This;
+	}
+
+EXPORT_C CApaWindowGroupName* CApaWindowGroupName::NewLC(const RWsSession& aWsSession, const TDesC& aWgName)
+	//
+	// static initializer from full name
+	// ONLY TO BE USED WITH A VALID (i.e existing) WINDOW GROUP NAME
+	//
+/** Creates a window group name object, assigns to it the specified name, and puts 
+a pointer to the new object onto the cleanup stack.
+
+The name must have valid format. Typically, this is an existing window group 
+name.
+
+@param aWsSession A window server session.
+@param aWgName A valid window group name.
+@return A pointer to the new window group name object. */
+	{
+	CApaWindowGroupName* This=new(ELeave) CApaWindowGroupName(aWsSession);
+	CleanupStack::PushL(This);
+	This->iBuf=aWgName.AllocL();
+	This->GetStatusFromName();
+	return This;
+	}
+
+CApaWindowGroupName::CApaWindowGroupName(const RWsSession& aWsSession) 
+	: iWsSession(aWsSession)
+	//
+	// private c'tor 
+	//
+	{
+	}
+
+
+void CApaWindowGroupName::DefaultConstructL()
+	{
+	iStatus=0;
+	iBuf = KDefaultWindowGroupName().AllocL();
+	}	
+
+EXPORT_C void CApaWindowGroupName::ConstructFromWgIdL(TInt aWgId)
+	//
+	// Allocate and format iBuf according to existing name given by aWgId
+	//
+/** Assigns to this object the name taken from the specified window group.
+
+Any previously existing name contained by this window group name object is 
+lost.
+
+If the specified window group does not exist or it has no name, then a default 
+name is assigned.
+
+@param aWgId The ID of a window group. */
+	{
+	delete iBuf;
+	iBuf=NULL;
+	if (aWgId>0)
+		{
+		TBuf<KMaxWindowGroupNameLength> name;
+		((RWsSession&)iWsSession).GetWindowGroupNameFromIdentifier(aWgId, name);
+		if (name.Length()==0) // name not set
+			DefaultConstructL();
+		else
+			{
+			iBuf=name.AllocL();
+			GetStatusFromName();
+			}
+		}
+	else
+		DefaultConstructL();
+	}
+
+EXPORT_C void CApaWindowGroupName::SetWindowGroupNameL(const TDesC& aWgName)
+/** Sets the full window group name in this object.
+
+@param aWgName The full window group name. */
+	{
+	delete iBuf;
+	iBuf=NULL;
+	iBuf=aWgName.AllocL();
+	GetStatusFromName();
+	}
+
+EXPORT_C void CApaWindowGroupName::SetWindowGroupName(HBufC* aWgName)
+/** Sets the full window group name in this object, taking ownership of the specified 
+heap descriptor.
+
+The function cannot leave.
+
+@param aWgName A heap descriptor containing the full window group name. The 
+pointer must not be null, otherwise the function raises a APGRFX 3 panic. */
+	{
+	if (aWgName)
+		{
+		if (iBuf != aWgName)
+			{
+			delete iBuf;
+			iBuf=aWgName;
+			}
+		GetStatusFromName();
+		}
+	else
+		Panic(EPanicNullWindowGroupName);
+	}
+
+EXPORT_C void CApaWindowGroupName::FindByAppUid(TUid aAppUid, RWsSession& aWsSession, TInt& aPrevWgId)
+/** Searches for the next window group by application UID.
+
+A running application, also known as a task, is associated with a window group. 
+The function searches for the next task running the specified application, 
+and returns its associated window group ID.
+
+@param aAppUid The application specific UID.
+@param aWsSession A window server session.
+@param aPrevWgId On entry, the previous window group ID. On return, the next 
+window group ID. On first call to this function pass a zero value. When there 
+are no more matching window groups, contains KErrNotFound. */
+	{
+	TBuf<20> match(KSearchAnyFile);	// status
+	match.Append(0);
+	TBuf<8> uidBuf;
+	//Type casting the Uid (which is TInt) to TUint to perform proper conversion
+	//when aAppUid.iUid is negative.
+	uidBuf.Num(TUint(aAppUid.iUid), EHex);
+	match.Append(uidBuf);  // uid
+	match.Append(0);
+	match.Append('*');	// caption
+	match.Append(0);	
+	match.Append('*');	// docname
+	aPrevWgId=aWsSession.FindWindowGroupIdentifier(aPrevWgId, match, 0);
+	}
+
+EXPORT_C void CApaWindowGroupName::FindByCaption(const TDesC& aCaption, RWsSession& aWsSession, TInt& aPrevWgId)
+/** Searches for the next window group by caption.
+
+A running application, also known as a task, is associated with a window group. 
+The function searches for the next task having the specified caption, and 
+returns its associated window group ID.
+
+@param aCaption The caption.
+@param aWsSession A window server session.
+@param aPrevWgId On entry, the previous window group ID. On return, the next 
+window group ID. On first call to this function pass a zero value. When there 
+are no more matching window groups, contains KErrNotFound. */
+	{
+	TApaSearchString match(KSearchAnyFile); // status
+	match.Append(0);
+	match.Append('*'); // uid
+	match.Append(0);
+	match.Append(aCaption);	 // caption
+	match.Append(0);
+	match.Append('*'); //doc name
+	aPrevWgId=aWsSession.FindWindowGroupIdentifier(aPrevWgId, match, 0);
+	}
+
+EXPORT_C void CApaWindowGroupName::FindByDocName(const TDesC& aDocName, RWsSession& aWsSession, TInt& aPrevWgId)
+/** Searches for the next window group by document name.
+
+A running application, also known as a task, is associated with a window group. 
+The function searches for the next task handling the specified document, and 
+returns its associated window group ID.
+
+@param aDocName The name of the document.
+@param aWsSession A window server session.
+@param aPrevWgId On entry, the previous window group ID. On return, the next 
+window group ID. On first call to this function pass a zero value. When there 
+are no more matching window groups, contains KErrNotFound. */
+	{
+	TApaSearchString match(KSearchAnyFile); // status
+	match.Append(0);
+	match.Append('*'); // uid
+	match.Append(0);
+	match.Append('*'); // caption
+	match.Append(0);
+	match.Append(aDocName);
+	aPrevWgId=aWsSession.FindWindowGroupIdentifier(aPrevWgId, match, 0);
+	}
+
+EXPORT_C void CApaWindowGroupName::SetBusy(TBool aBusy)
+/** Sets the task's busy status in this object.
+
+@param aBusy ETrue, marks the task as busy; EFalse, marks the task as not 
+busy.
+@see CEikonEnv::SetBusy() */
+	{
+	iStatus&=(~EBusy);
+	if (aBusy)
+		iStatus|=EBusy;
+	WriteStatusToName();
+	}
+
+EXPORT_C TBool CApaWindowGroupName::IsBusy() const
+/** Tests whether the task is marked as busy.
+
+@return True, if the task is marked as busy; false, otherwise.
+@see CEikonEnv::IsBusy() */
+	{
+	return iStatus&EBusy;
+	}
+
+EXPORT_C void CApaWindowGroupName::SetSystem(TBool aSystem)
+/** Sets the task's system status in this object.
+
+@param aSystem ETrue, marks the task as a system task; EFalse, marks the task 
+as not a system task.
+@see CEikonEnv::SetSystem() */
+	{
+	iStatus&=(~ESystem);
+	if (aSystem)
+		iStatus|=ESystem;
+	WriteStatusToName();
+	}
+
+EXPORT_C TBool CApaWindowGroupName::IsSystem() const
+/** Tests whether the task is marked as a system task.
+
+@return True, if the task is marked as a system task; false, otherwise. 
+@see CEikonEnv::IsSystem() */
+	{
+	return iStatus&ESystem;
+	}
+
+EXPORT_C void CApaWindowGroupName::SetDocNameIsAFile(TBool aDocNameIsAFile)
+/** Sets the document name status in this object.
+
+@param aDocNameIsAFile ETrue, the document name is a filename; EFalse, the 
+document name is not a filename.
+@see CEikonEnv::SetDocNameIsAFile() */
+	{
+	iStatus&=(~EDocNameNotAFile);
+	if (!aDocNameIsAFile)
+		iStatus|=EDocNameNotAFile;
+	WriteStatusToName();
+	}
+
+EXPORT_C TBool CApaWindowGroupName::DocNameIsAFile() const
+/** Tests whether the document name is a file.
+
+@return True, if the document name is a file; false, otherwise.
+@see CEikonEnv::DocNameIsAFile() */
+	{
+	return !(iStatus&EDocNameNotAFile);
+	}
+
+EXPORT_C void CApaWindowGroupName::SetRespondsToShutdownEvent(TBool aRespondsToShutdownEvent)
+/** Sets the task's shutdown handling status in this object.
+
+@param aRespondsToShutdownEvent ETrue, if the task can deal with a shutdown 
+request; EFalse, if the task cannot deal with a shutdown request.
+@see CEikonEnv::SetRespondsToShutdownEvent() */
+	{
+	iStatus&=(~EDoesNotRespondToShutdownEvent);
+	if (!aRespondsToShutdownEvent)
+		iStatus|=EDoesNotRespondToShutdownEvent;
+	WriteStatusToName();
+	}
+
+EXPORT_C TBool CApaWindowGroupName::RespondsToShutdownEvent() const
+/** Tests whether the task can deal with a request to shutdown.
+
+@return True, if the task can deal with a request to shutdown; false, otherwise. 
+
+@see CEikonEnv::RespondsToShutdownEvent() */
+	{
+	return !(iStatus&EDoesNotRespondToShutdownEvent);
+	}
+
+EXPORT_C void CApaWindowGroupName::SetRespondsToSwitchFilesEvent(TBool aRespondsToSwitchFilesEvent)
+/** Sets the task's switch file handling status in this object.
+
+@param aRespondsToSwitchFilesEvent ETrue, if the task can deal with a request 
+to switch file; EFalse, if the task cannot deal with with a request to switch 
+files.
+@see CEikonEnv::SetRespondsToSwitchFilesEvent() */
+	{
+	iStatus&=(~EDoesNotRespondToSwitchFilesEvent);
+	if (!aRespondsToSwitchFilesEvent)
+		iStatus|=EDoesNotRespondToSwitchFilesEvent;
+	WriteStatusToName();
+	}
+
+EXPORT_C TBool CApaWindowGroupName::RespondsToSwitchFilesEvent() const
+/** Tests whether the task can deal with a request to switch files.
+
+@return True, if the task can deal with a request to switch files; false otherwise.
+@see CEikonEnv::RespondsToSwitchFilesEvent() */
+	{
+	return !(iStatus&EDoesNotRespondToSwitchFilesEvent);
+	}
+
+EXPORT_C void CApaWindowGroupName::SetHidden(TBool aIsHidden)
+/** Marks the task as hidden.
+
+In general, tasks marked as hidden do not appear in tasklists. 
+Specifically, TApaTask::FindByPos() will ignore any tasks marked as hidden.
+
+@param aIsHidden ETrue if the task is to be marked as hidden; EFalse if not. */
+	{
+	iStatus&=(~EIsHidden);
+	if (aIsHidden)
+		iStatus|=EIsHidden;
+	WriteStatusToName();
+	}
+
+EXPORT_C TBool CApaWindowGroupName::Hidden() const
+/** Tests whether the task is marked as hidden.
+
+@return True if the task is hidden; false otherwise. */
+	{
+	return (iStatus&EIsHidden);
+	}
+
+EXPORT_C void CApaWindowGroupName::SetAppReady(TBool aIsReady)
+/** Sets the task as ready.
+
+@param aIsReady ETrue if the task is to be marked as ready; EFalse if not. */
+	{
+	iStatus&=(~EAppReady);
+	if (aIsReady)
+		iStatus|=EAppReady;
+	WriteStatusToName();
+	}
+
+EXPORT_C TBool CApaWindowGroupName::IsAppReady() const
+/** Tests whether the task is marked as ready.
+
+@return True if the task is ready; false otherwise. */
+	{
+	return (iStatus&EAppReady);
+	}
+
+EXPORT_C void CApaWindowGroupName::SetAppUid(TUid aAppUid)
+/** Sets the specified UID into the window group name in this object.
+
+@param aAppUid The application specific UID. */
+	{
+	TInt start=FindDelimiter(EEndStatus);
+	if (start>0)
+		{
+		start++;
+		TInt end=FindDelimiter(EEndUid);
+		if (end>0)
+			{
+			TBuf<KUidBufLength> uidBuf;
+		 	//Type casting the Uid (which is TInt) to TUint to perform proper conversion
+			//when aAppUid.iUid is negative.
+			uidBuf.Num(TUint(aAppUid.iUid), EHex);
+			TPtr des=iBuf->Des();
+			des.Replace(start, end-start, uidBuf);
+			}
+		}
+	}
+
+
+EXPORT_C TUid CApaWindowGroupName::AppUid() const
+/** Gets the UID of the task's application.
+
+@return The application specific UID. If the format of the window group name 
+is not recognized, then this is zero. */
+	{
+	TUid uid=TUid::Null();
+	TInt start=FindDelimiter(EEndStatus);
+	if (start>0)
+		{
+		start++;
+		TInt end=FindDelimiter(EEndUid);
+		if ((end-start) == KUidBufLength)
+			{
+			TBuf<KUidBufLength> uidBuf=iBuf->Mid(start, end-start);
+			TLex lex(uidBuf);
+			TUint32 val = 0;
+			lex.Val(val, EHex); //Ignoring error code since we anyways have to return null uid if this returns an error.
+			uid.iUid = val;
+			}
+		}
+	return uid;
+	}
+
+EXPORT_C void CApaWindowGroupName::SetCaptionL(const TDesC& aCaption)
+/** Sets the specified caption into the window group name in this object.
+
+@param aCaption The caption. */
+	{	 
+	TInt start=FindDelimiter(EEndUid);
+	if (start>0)
+		{
+		start++;
+		TInt end=FindDelimiter(EEndCaption);
+		if (end>0)
+			{
+			TInt length=end-start;
+			ReAllocIfNecessaryL(aCaption.Length()-length);
+			TPtr des=iBuf->Des();
+			des.Replace(start, length, aCaption);
+			}
+		}
+	}
+
+EXPORT_C TPtrC CApaWindowGroupName::Caption() const
+/** Gets the task's caption.
+
+@return A non-modifiable pointer descriptor representing the caption. If the 
+format of the window group name is not recognized, then this is a zero length 
+descriptor. */
+	{
+	TInt start=FindDelimiter(EEndUid);
+	if (start>0)
+		{
+		start++;
+		TInt end=FindDelimiter(EEndCaption);
+		if (end>0)
+			return iBuf->Mid(start, end-start);
+		}
+	return TPtrC(); // error
+	}
+
+EXPORT_C void CApaWindowGroupName::SetDocNameL(const TDesC& aDocName)
+/** Sets the specified document name into the window group name in this object.
+
+@param aDocName The document name. */
+	{
+	TInt start=FindDelimiter(EEndCaption);
+	if (start>0)
+		{
+		start++;
+		TInt end=iBuf->Length();
+		if (end>0)
+			{
+			TInt length=end-start;
+			ReAllocIfNecessaryL(aDocName.Length()-length);
+			TPtr des=iBuf->Des();
+			des.Replace(start, length, aDocName);
+			}
+		}
+	}
+
+EXPORT_C TPtrC CApaWindowGroupName::DocName() const
+/** Gets the name of the document that the task is handling.
+
+@return A non-modifiable pointer descriptor representing the document name. 
+If the format of the window group name is not recognized, then this is a zero 
+length descriptor. */
+	{
+	TInt start=FindDelimiter(EEndCaption);
+	if (start>0)
+		{
+		start++;
+		TInt end=iBuf->Length();
+		if (end>0)
+			return iBuf->Mid(start, end-start);
+		}
+	return TPtrC(); // error
+	}
+
+EXPORT_C TInt CApaWindowGroupName::SetWindowGroupName(RWindowGroup& aGroupWin) const
+	//
+	// Set aGroupWin's name to the current name in iBuf (returns WServ error code)
+	//
+/** Sets the window group name contained by this object into the specified window 
+group.
+
+@param aGroupWin The window group.
+@return KErrNone, if successful; otherwise, one of the other system-wide error 
+codes. */
+	{
+	return aGroupWin.SetName(*iBuf);
+	}
+
+EXPORT_C TPtrC CApaWindowGroupName::WindowGroupName() const
+/** Gets the full window group name.
+
+@return A non-modifiable pointer descriptor representing the full window group 
+name. */
+	{
+	return *iBuf;
+	}
+
+void CApaWindowGroupName::WriteStatusToName()
+	//
+	// replaces two digit hex number at front of iBuf by iStatus 
+	//
+	{
+	TBuf<2> status;
+	status.Format(KFormatStatus, iStatus);
+	TPtr des=iBuf->Des();
+	des.Replace(0,2,status);
+	}
+
+void CApaWindowGroupName::GetStatusFromName()
+	//
+	// Extracts the two digit hex number at front of iBuf into iStatus 
+	//
+	{
+	TBuf<2> status=iBuf->Left(2);
+	TLex lex(status);
+	lex.Val(iStatus, EHex);
+	}
+
+TInt CApaWindowGroupName::FindDelimiter(TApaDelimiter aDelim) const
+	//
+	// returns the pos of aDelim or KErrNotFound
+	//
+	{
+	TInt pos=-1;
+	TInt length=iBuf->Length();
+	for (TInt i=0; i<aDelim; i++)
+		{
+		TInt nextPos=(iBuf->Right(length-pos-1)).Locate(0);
+		if (nextPos<0)
+			return KErrNotFound;
+		pos=pos+nextPos+1;
+		}
+	return pos;
+	}
+
+void CApaWindowGroupName::ReAllocIfNecessaryL(TInt aExtraLengthReqd)
+	//
+	// Reallocates iBuf if currentLength+extraLength<totalLength
+	//
+	{
+	TInt existing=iBuf->Length();
+	TInt total=existing+aExtraLengthReqd;
+	if (total>iBuf->Des().MaxLength())
+		iBuf=iBuf->ReAllocL(total);
+	}