Code Search for Developers
 
 
  

CWContainer.m from redshed at Krugle


Show CWContainer.m syntax highlighted

/*
**  CWContainer.m
**
**  Copyright (c) 2002-2004
**
**  Author: Ludovic Marcotte <ludovic@Sophos.ca>
**
**  This library is free software; you can redistribute it and/or
**  modify it under the terms of the GNU Lesser General Public
**  License as published by the Free Software Foundation; either
**  version 2.1 of the License, or (at your option) any later version.
**  
**  This library is distributed in the hope that it will be useful,
**  but WITHOUT ANY WARRANTY; without even the implied warranty of
**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
**  Lesser General Public License for more details.
**  
**  You should have received a copy of the GNU Lesser General Public
**  License along with this library; if not, write to the Free Software
**  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/

#include <Pantomime/CWContainer.h>

#include <Pantomime/CWConstants.h>
#include <Pantomime/CWInternetAddress.h>
#include <Pantomime/CWMessage.h>


//
//
//
@implementation CWContainer

- (id) init
{
  self = [super init];

  message = nil;
  parent = nil;
  child = nil;
  next = nil;

  return self;
}


//
//
//
- (void) dealloc
{
  TEST_RELEASE(parent);
  TEST_RELEASE(child);
  TEST_RELEASE(next);

  [super dealloc];
}


//
// access / mutation methods
//
- (void) setParent: (CWContainer *) theParent
{
  if (theParent)
    {
      ASSIGN(parent, theParent);
    }
  else
    {
      DESTROY(parent);
    }
}


// 
//
//
#warning Fix mem leaks
- (void) setChild: (CWContainer *) theChild
{
  if (!theChild || theChild == self || theChild->next == self || theChild == child)
    {
      return;
    }
  
  if (theChild)
    {
      CWContainer *aChild;

      // We search down in the children of theChild to be sure that
      // self IS NOT reachable
      // FIXME - we should use childrenEnumerator since we are NOT looping
      // in all children with this code
      aChild = theChild->child;

      while (aChild)
      	{
      	  if (aChild == self)
      	    {
	      return;
      	    }
	  aChild = aChild->next;
      	}


      RETAIN(theChild);
      //RELEASE(child);
      //child = theChild;
      
      // We finally add it!
      if (!child)
	{
	  child = theChild;
	}
      else
	{	  
	  aChild = child;

	  // We go at the end of our list of children
	  //while ( aChild->next != nil && aChild->next != aChild )
	  while (aChild->next != nil)
	    {     
	      if (aChild->next == aChild)
		{
		  aChild->next = theChild;
		  return;
		}

	      // We don't add the child if it's already there
	      if (aChild == theChild)
		{
		  return;
		}

	      aChild = aChild->next;
	    }

	  aChild->next = theChild;
	}
   
    }
  else
    {
      DESTROY(child);
    }
}


//
//
//
- (CWContainer *) childAtIndex: (unsigned int) theIndex
{
  CWContainer *aChild;
  unsigned int i;

  aChild = child;

  for (i = 0; i < theIndex && aChild; i++)
    {     
      aChild = aChild->next;
    }

  return aChild;
}


//
//
//
- (unsigned int) count
{
  if (child)
    {
      CWContainer *aChild;
      unsigned int count;

      aChild = child;
      count = 0;

      while (aChild)
	{
	  //if ( aChild == self || aChild->next == aChild )
	  if (aChild == self)
	    {
	      count = 1;
	      break;
	    }

	  aChild = aChild->next;
	}

      return count;
    }
  
  return 0;
}


//
//
//
- (void) setNext: (CWContainer *) theNext
{
  if (theNext)
    {
      ASSIGN(next, theNext);
    }
  else
    {
      DESTROY(next);
    }
}


//
//
//
- (NSEnumerator *) childrenEnumerator
{
  NSMutableArray *aMutableArray;
  CWContainer *aContainer;

  aMutableArray = [[NSMutableArray alloc] init];
  AUTORELEASE(aMutableArray);

  aContainer = child;
  
  while (aContainer)
    {
      [aMutableArray addObject: aContainer];
      
      // We add, recursively, all its children
      [aMutableArray addObjectsFromArray: [[aContainer childrenEnumerator] allObjects]];

      // We get our next container
      aContainer = aContainer->next;
    }

  return [aMutableArray objectEnumerator];
}

@end




See more files for this project here

redshed

Code for Mac+WebObjects.

Project homepage: http://sourceforge.net/projects/redshed
Programming language(s): C,Java,Objective C
License: other

  English.lproj/
  CWCacheManager.h
  CWCacheManager.m
  CWCharset.h
  CWCharset.m
  CWConnection.h
  CWConstants.h
  CWConstants.m
  CWContainer.h
  CWContainer.m
  CWDNSManager.h
  CWDNSManager.m
  CWFlags.h
  CWFlags.m
  CWFolder.h
  CWFolder.m
  CWFolderInformation.h
  CWFolderInformation.m
  CWIMAPCacheManager.h
  CWIMAPCacheManager.m
  CWIMAPFolder.h
  CWIMAPFolder.m
  CWIMAPMessage.h
  CWIMAPMessage.m
  CWIMAPStore.h
  CWIMAPStore.m
  CWISO8859_1.h
  CWISO8859_1.m
  CWISO8859_10.h
  CWISO8859_10.m
  CWISO8859_11.h
  CWISO8859_11.m
  CWISO8859_13.h
  CWISO8859_13.m
  CWISO8859_14.h
  CWISO8859_14.m
  CWISO8859_15.h
  CWISO8859_15.m
  CWISO8859_2.h
  CWISO8859_2.m
  CWISO8859_3.h
  CWISO8859_3.m
  CWISO8859_4.h
  CWISO8859_4.m
  CWISO8859_5.h
  CWISO8859_5.m
  CWISO8859_6.h
  CWISO8859_6.m
  CWISO8859_7.h
  CWISO8859_7.m
  CWISO8859_8.h
  CWISO8859_8.m
  CWISO8859_9.h
  CWISO8859_9.m
  CWInternetAddress.h
  CWInternetAddress.m
  CWKOI8_R.h
  CWKOI8_R.m
  CWKOI8_U.h
  CWKOI8_U.m
  CWLocalCacheManager.h
  CWLocalCacheManager.m
  CWLocalFolder+maildir.h
  CWLocalFolder+maildir.m
  CWLocalFolder+mbox.h
  CWLocalFolder+mbox.m
  CWLocalFolder.h
  CWLocalFolder.m
  CWLocalMessage.h
  CWLocalMessage.m
  CWLocalStore.h
  CWLocalStore.m
  CWMD5.h
  CWMD5.m
  CWMIMEMultipart.h
  CWMIMEMultipart.m
  CWMIMEUtility.h
  CWMIMEUtility.m
  CWMacOSXGlue.h
  CWMacOSXGlue.m
  CWMessage.h
  CWMessage.m
  CWPOP3CacheManager.h
  CWPOP3CacheManager.m
  CWPOP3CacheObject.h
  CWPOP3CacheObject.m
  CWPOP3Folder.h
  CWPOP3Folder.m
  CWPOP3Message.h
  CWPOP3Message.m
  CWPOP3Store.h
  CWPOP3Store.m
  CWParser.h
  CWParser.m
  CWPart.h
  CWPart.m
  CWRegEx.h
  CWRegEx.m
  CWSMTP.h
  CWSMTP.m