Blob Blame History Raw
//
//  DCPurpleSIPEJoinChatViewController.m
//  SIPEAdiumPlugin
//
//  Copyright (C) 2015 SIPE Project <http://sipe.sourceforge.net/>
//
//  Created by Michael Lamb on 02/10/12.
//  Copyright 2012 Michael Lamb. All rights reserved.
//

#import "DCPurpleSIPEJoinChatViewController.h"
#import <Adium/AIChatControllerProtocol.h>
#import <Adium/DCJoinChatWindowController.h>
#import <Adium/AIAccount.h>
#import <Adium/ESDebugAILog.h>
#import <AdiumLibPurple/CBPurpleAccount.h>
#import "roomlist.h"

@implementation DCPurpleSIPEJoinChatViewController

- (id)init
{
    self = [super init];
    if (self) {
        room_dict = [[NSMutableDictionary alloc] init];
        combo_rooms.usesDataSource = YES;
        combo_rooms.completes  = YES;
        combo_rooms.dataSource = self;
    }
    return self;
}

- (void)dealloc
{
    [timer invalidate];
    timer = nil;
    if (room_list != NULL) {
        purple_roomlist_unref(room_list);
        room_list = NULL;
    }
    [room_dict release];
    [super dealloc];
}

- (void)configureForAccount:(AIAccount *)inAccount
{
    [super configureForAccount:inAccount];
    if ( delegate ) {
        [(DCJoinChatWindowController *)delegate setJoinChatEnabled:YES];
    }

    // get room list
    if (room_list == NULL) {
        // we want to run that code only once (configureForAccount is called twice actually)
        CBPurpleAccount *pinAccount = (CBPurpleAccount*)inAccount;
        room_list = purple_roomlist_get_list(pinAccount.purpleAccount->gc);
        if (room_list) {
            purple_roomlist_ref(room_list);
            [progress_fetch startAnimation:self];
            // start a timer to control when the fetching is done
            timer = [NSTimer scheduledTimerWithTimeInterval:0.5
                                                     target:self
                                                   selector:@selector(checkForRoomlistFetchCompletion:)
                                                   userInfo:nil
                                                    repeats:YES];
        } else {
            [progress_fetch setHidden:YES];
            AILog(@"(DCPurpleSIPEJoinChatViewController) Can't fetch room list.");
        }
    }
}

- (void)joinChatWithAccount:(AIAccount *)inAccount
{
    NSString *uri = nil;
    NSInteger idx = [combo_rooms indexOfSelectedItem];

    if (idx >= 0 && [room_dict count]) {
        // get selected entry
        NSString *key = [[room_dict allKeys] objectAtIndex:idx];

        if (key)
            uri = [room_dict valueForKey:key];

    } else
        uri = [combo_rooms stringValue];

    if (uri && [uri length]) {
        NSRange res = [uri rangeOfString:@"ma-chan://" options:NSCaseInsensitiveSearch];

        if (res.location != 0) {
            NSAlert *alert = [[NSAlert alloc] init];

            [alert setMessageText:@"Invalid room URI"];
            [alert setInformativeText:[combo_rooms toolTip]];
            [alert addButtonWithTitle:@"Ok"];
            [alert runModal];
            [alert release];

        } else {

            [self doJoinChatWithName:[NSString stringWithFormat:@"%@",uri]
                           onAccount:inAccount
                    chatCreationInfo:[NSDictionary dictionaryWithObjectsAndKeys:
                                      uri, @"uri",
                                      nil]
                    invitingContacts:nil
               withInvitationMessage:nil];

        }
    } else {
        AILog(@"(DCPurpleSIPEJoinChatViewController) No URI specified.");
    }

    // TODO: allow creation of OCS "Conference" (different from group-chat)
    // Add a text field (UI should have radio buttons to enable/disable
    // create a PurpleBuddy* based off of the username entered in the text field
    // then call:
    //        sipe_core_buddy_new_chat(PURPLE_BUDDY_TO_SIPE_CORE_PUBLIC, purple_buddy_get_name(buddy));
    // which should kick off the Adium code to open a chat window.

}

- (void)checkForRoomlistFetchCompletion:(NSTimer*) aTimer
{
    if (room_list && purple_roomlist_get_in_progress(room_list) == FALSE) {
        [progress_fetch stopAnimation:self];
        [progress_fetch setHidden:YES];
        [timer invalidate];
        timer = nil;

        // finally copy the list into our dict
        for (GList *rooms = room_list->rooms; rooms != NULL; rooms = rooms->next) {
            PurpleRoomlistRoom *room = rooms->data;
            gchar *roomName = room->name;
            gchar *uriStr    = room->fields->data;
            if (roomName != NULL && uriStr != NULL) {
                NSString *nameStr = [NSString stringWithUTF8String:roomName];
                if ([room_dict objectForKey:nameStr] == nil) {
                    [room_dict setObject:[NSString stringWithUTF8String:uriStr] forKey:nameStr];
                }
            }
        }

        purple_roomlist_unref(room_list);
        room_list = NULL;
    }
}

#pragma mark NSComboBoxDataSource

- (NSInteger) numberOfItemsInComboBox:(NSComboBox*) aComboBox
{
    return [room_dict count];
}
- (id)comboBox:(NSComboBox *)aComboBox objectValueForItemAtIndex:(NSInteger)index
{
    NSArray* keys = [room_dict allKeys];
    return [keys objectAtIndex:index];
}

// String completion
- (NSString *)comboBox:(NSComboBox *)aComboBox completedString:(NSString *)uncompletedString
{
    if ([room_dict count] == 0 || uncompletedString == nil) {
        return @"";
    }
    NSArray *keys = [room_dict allKeys];
    for (NSString *key in keys) {
        NSRange res = [key rangeOfString:uncompletedString options:NSCaseInsensitiveSearch];
        if (res.location != NSNotFound && res.location == 0) {
            return key;
        }
    }

    return @"";
}

- (NSUInteger)comboBox:(NSComboBox *)aComboBox indexOfItemWithStringValue:(NSString *)aString
{
    if ([room_dict count] == 0) {
        return NSNotFound;
    }
    NSArray *keys = [room_dict allKeys];
    return [keys indexOfObjectIdenticalTo:aString];
}

#pragma mark

- (NSString *)nibName
{
    return @"DCPurpleSIPEJoinChatView";
}

@end