/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
/*
 * @copyright See LICENCE for copyright and license information.
 *
 * @author Alexander Afanasyev <alexander.afanasyev@ucla.edu>
 * @author Ilya Moiseenko <iliamo@ucla.edu>
 */

#include "config.h"
#import "ndnd-status-operation.h"

@implementation NdndStatusOperation

-(id)initWithDelegate:(MenuDelegate*)delegate
{
  if (![super init]) return nil;
  m_delegate = delegate;
  return self;
}

-(void)main
{
  NSTask *task = [[NSTask alloc] init];
  [task setLaunchPath: @NDND_STATUS_COMMAND];
  [task setArguments: [NSArray arrayWithObjects: @"status",@"-x",nil]];

  NSPipe * out = [NSPipe pipe];
  [task setStandardOutput:out];

  [task launch];
  [task waitUntilExit];

  NSFileHandle * read = [out fileHandleForReading];
  NSData * dataRead = [read readDataToEndOfFile];
  NSString *stringRead = [[NSString alloc] initWithData:dataRead encoding:NSUTF8StringEncoding];

  if ([stringRead isEqualToString:@""]) {
    [m_delegate performSelectorOnMainThread:@selector(statusUnavailable:)
                                 withObject:nil
                                 waitUntilDone:YES];
    
  } else {
    NSError *error = nil;
    NSXMLDocument *document = [[NSXMLDocument alloc]
                                initWithXMLString:stringRead
                                          options:0
                                          error:&error];

    [m_delegate performSelectorOnMainThread:@selector(statusUpdated:)
                                 withObject:document
                                 waitUntilDone:YES];
  }
  
  // [daemonStatusText setStringValue:stringRead];
}

@end
