[OGo-Developer] stuffing an NSArray into a NSMutableDictionary

Rafel Amer Ramon developer@opengroupware.org
Tue, 24 Apr 2007 14:46:45 +0200


This is a multi-part message in MIME format.
--------------030605040303000004020300
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

En/na Sebastian Reitenbach ha escrit:
> Hi Rafel,
> I had to change the 
>
>       temparray = [[queuesdict objectForKey:[[event objectForKey:@"Queue"] 
>                           objectForKey:@"Agents"]];
>
> to let it compile, but then it ended up in an exception (Some 
> NSConcrete8BitString does not recognize objectForKey) while running and I 
> enter the AsteriskUI in OGo. Then I tried to replace my shuffling around 
> with temporary variables where I put the queuesdict into the 
> self->multipleReturn, your version:
>
>    [self->multipleReturn release];
>    self->multipleReturn = nil;
>    self->multipleReturn = [[queuesdict allValues] retain];
>
> mixed the array completely up, My webUI expects an array, and the 
> repetitions made it looking funny ;) 
> my version of it below, but just only for one queue:
>
>     [queuesdict takeValue:[membersarray copy] forKey:@"Agents"];
>     NSMutableArray *tmparray;
>     tmparray = [[NSMutableArray alloc] init];
>     [tmparray addObject:queuesdict];
>     [self->multipleReturn removeAllObjects];
>     ASSIGN(self->multipleReturn, [tmparray copy]);
>
> nevertheless, thanks for taking time.
>
> kind regards
> Sebastian
>   

Hi Sebastian,

I send you the program with my latest tries. I think it works even
if the initial values of self->multipleReturn are  not ordered

You have to compile the program try.m with
gcc -o try -lFoundation try.m
 
Kind regards,

Rafel

-- 
Aquest missatge ha estat analitzat per MailScanner
a la cerca de virus i d'altres continguts perillosos,
i es considera que està net.
For all your IT requirements visit: http://www.transtec.co.uk


--------------030605040303000004020300
Content-Type: text/plain;
 name="input.txt"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="input.txt"

(   
    {
        Abandoned = " 0";
        Calls = " 0";
        Completed = " 0";
        Event = " QueueParams";
        Queue = " l00-bugdead-prods-queue";
    },
    {
        Abandoned = " 0";
        Calls = " 0";
        Event = " QueueMember";
        Location = " Agent/202";
        Queue = " l00-bugdead-prods-queue";
    },
    {
        Abandoned = " 0";
        Calls = " 0";
        Event = " QueueMember";
        Location = " Agent/303";
        Queue = " l00-bugdead-prods-queue";
    },
    {
        Abandoned = " 0";
        Calls = " 0";
        Event = " QueueMember";
        Location = " Agent/101";
        Queue = " l11-bugdead-prods-queue";
    },
    {
        Abandoned = " 0";
        Calls = " 0";
        Event = " QueueMember";
        Location = " Agent/303";
        Queue = " l11-bugdead-prods-queue";
    },
    {
        Abandoned = " 0";
        Calls = " 0";
        Event = " QueueMember";
        Location = " Agent/202";
        Queue = " l11-bugdead-prods-queue";
    },
    {
        Abandoned = " 0";
        Calls = " 0";
        Completed = " 0";
        Event = " QueueParams";
        Queue = " l11-bugdead-prods-queue";
    }
  );

--------------030605040303000004020300
Content-Type: text/x-objcsrc;
 name="try.m"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="try.m"

#include <Foundation/Foundation.h>

@interface StuffingArray : NSObject
{
  NSArray *multipleReturn;
}

- (NSArray *)multipleReturn;
- (NSArray *)getQueues;

@end

@implementation StuffingArray

- (id)init {
  NSData     *data;
  NSString   *contents;

  data = [NSData dataWithContentsOfFile:@"input.txt"];
  contents = [[NSMutableString alloc] initWithData:data	
	      encoding:NSISOLatin1StringEncoding];
  self->multipleReturn = [contents propertyList];
  return self;
}

- (void)dealloc {
  [self->multipleReturn release];
  [super dealloc];
}

- (NSArray *)getQueues {
  NSEnumerator *e;
  NSMutableDictionary *queuesdict;
  NSMutableArray *queuesarray;
  id event;

  queuesdict = [[NSMutableDictionary alloc] init];
  queuesarray = [[NSMutableArray alloc] init];

  e = [self->multipleReturn objectEnumerator];
  while ((event = [e nextObject]) != nil) {
    NSString *queue;
    NSMutableDictionary *tempdict;
    NSMutableArray *temparray;
    
    queue = [event objectForKey:@"Queue"];
    /*
      First, if needed, we initialize the dictionary queuesdict with
      an empty dictionary for the key queue. For that dictionary,
      we initialize the key "Agents" with an empty array. 
    */
    if([queuesdict objectForKey:queue] == nil) {    
      temparray = [[NSMutableArray alloc] init];
      tempdict = [[NSMutableDictionary alloc] init];
      [tempdict setObject:[temparray retain] forKey:@"Agents"];
      [queuesdict setObject:[tempdict retain] forKey:queue];
    }
    /*
      Now whe are sure that the values are initialized, 
      we get that values
    */
    tempdict = [queuesdict objectForKey:queue];
    temparray = [tempdict objectForKey:@"Agents"];
    /*
      Finally, we assign values.
      The queuesarray is used to get the order in which the
      QueueParams appears, so that we can preserve ordering.
    */

    if ([[event objectForKey:@"Event"] hasSuffix:@" QueueParams"]) {
      [tempdict addEntriesFromDictionary:event];
      [queuesarray addObject:queue];
    } else {
      [temparray addObject:event];
    }
  }  

  int k;
  NSString *elem;
  [self->multipleReturn release];
  self->multipleReturn = nil;

  /*
    Now we replace the values of queuesarray for the values
    of queuesdict, so that we get the final array.
  */

  for(k=0;k<[queuesarray count];k++) {
    elem = [queuesarray objectAtIndex:k];
    [queuesarray replaceObjectAtIndex:k withObject:[queuesdict objectForKey:elem]];
  }
  self->multipleReturn = [queuesarray retain];
  return self->multipleReturn;
}

- (NSArray *)multipleReturn {
  return self->multipleReturn;
}

@end

int main(int argc, char **argv, char **env) {
  NSAutoreleasePool *pool;
  StuffingArray     *stuffing;
  NSArray *out;

  [NSProcessInfo initializeWithArguments:argv count:argc environment:env];
  pool = [NSAutoreleasePool new];
  stuffing = [[StuffingArray alloc] init];
  out = [stuffing getQueues];   
  NSLog(@"HHHHHHHHHHHHH %@",[stuffing multipleReturn]);
  exit(0);
}

--------------030605040303000004020300--