home *** CD-ROM | disk | FTP | other *** search
- /*
- ** Amster - Hotlist
- ** by Jacob Laursen <laursen@myself.com>
- */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
- #include <proto/dos.h>
- #include <proto/socket.h>
- #include <proto/utility.h>
-
- #include <netdb.h>
- #include <sys/time.h>
- #include <sys/socket.h>
- #include <sys/ioctl.h>
- #include <netinet/tcp.h>
- #include <bsdsocket/socketbasetags.h>
- #include <error.h>
- #include <time.h>
-
- #include <MUI/Lamp_mcc.h>
- #include <MUI/NListview_mcc.h>
-
- #include "include/config.h"
- #include "include/gui.h"
- #include "include/info.h"
- #include "include/mui.h"
- #include "include/hotlist.h"
- #include "include/prefs.h"
- #include "include/search.h"
- #include "include/resultview.h"
- #include "include/share.h"
-
- #include "include/protos.h"
- #include "amster_Cat.h"
-
- /* Global variables */
-
- BOOL HotlistChanged = FALSE;
-
- int browse_count = 0;
- int browse_state = 0;
-
-
- /* Private prototypes */
-
- MUIF HotlistDisplay(REG(a2) char **array, REG(a1) struct HotlistEntry *entry);
- MUIF HotlistCompare(REG(a0) struct Hook *hook, REG(a2) Object *obj, REG(a1) struct NList_CompareMessage *ncm);
- MUIF HotlistDestruct(REG(a2) APTR pool, REG(a1) struct HotlistEntry *entry);
- void LoadHotlist(struct HotlistData *data);
- void SaveHotlist(struct HotlistData *data);
- void UploadHotlist(struct HotlistData *data);
- struct HotlistEntry *GetHotlistEntry(struct HotlistData *data, char *nick);
-
-
- MUIF HotlistDispatch(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
- {
- struct HotlistData *data;
-
- switch (msg->MethodID) {
- case OM_NEW:
- return(HotlistNew(cl, obj, (APTR)msg));
- case HOTLIST_LOAD:
- data = INST_DATA(cl, obj);
- LoadHotlist(data);
- return NULL;
- case HOTLIST_SAVE:
- data = INST_DATA(cl, obj);
- SaveHotlist(data);
- return NULL;
- case HOTLIST_UPLOAD:
- data = INST_DATA(cl, obj);
- UploadHotlist(data);
- return NULL;
- case HOTLIST_CLEAR:
- data = INST_DATA(cl, obj);
- DoMethod(data->LV_Search, RESULTVIEW_CLEAR, (((muimsg)msg)->arg1));
- return NULL;
- case HOTLIST_SIGNON:
- {
- long pos;
- struct HotlistEntry *entry;
-
- data = INST_DATA(cl, obj);
- if (entry = GetHotlistEntry(data, (char *)(((muimsg)msg)->arg1))) {
- entry->Online = 1;
- if ((int)(((muimsg)msg)->arg2) != entry->Speed) {
- entry->Speed = (int)(((muimsg)msg)->arg2);
- HotlistChanged = TRUE;
- }
- pos = MUIV_NList_GetPos_Start;
- DoMethod(data->LV_Hotlist, MUIM_NList_GetPos, entry, &pos);
- DoMethod(data->LV_Hotlist, MUIM_NList_Redraw, pos);
- DoMethod(data->LV_Hotlist, MUIM_NList_Sort);
- }
- return NULL;
- }
- case HOTLIST_SIGNOFF:
- {
- long pos;
- struct HotlistEntry *entry;
-
- data = INST_DATA(cl, obj);
- if (entry = GetHotlistEntry(data, (char *)(((muimsg)msg)->arg1))) {
- entry->Online = 0;
- pos = MUIV_NList_GetPos_Start;
- DoMethod(data->LV_Hotlist, MUIM_NList_GetPos, entry, &pos);
- DoMethod(data->LV_Hotlist, MUIM_NList_Redraw, pos);
- DoMethod(data->LV_Hotlist, MUIM_NList_Sort);
- }
- return NULL;
- }
- case HOTLIST_SIGNOFF_ALL:
- {
- int i;
- struct HotlistEntry *entry;
-
- data = INST_DATA(cl, obj);
- for (i=0; ; i++) {
- DoMethod(data->LV_Hotlist, MUIM_NList_GetEntry, i, &entry);
- if (!entry) break;
- entry->Online = 0;
- DoMethod(data->LV_Hotlist, MUIM_NList_Redraw, i);
- }
- return NULL;
- }
- case HOTLIST_ADD:
- {
- struct HotlistEntry *entry;
- char *buf;
- data = INST_DATA(cl, obj);
-
- get(data->ST_Nick, MUIA_String_Contents, &buf);
- if (buf && buf[0] != '\0' && (entry = malloc(sizeof(struct HotlistEntry)))) {
- entry->Online = 0;
- entry->Speed = 0;
- entry->Nick = strdup(buf);
-
- DoMethod(data->LV_Hotlist, MUIM_NList_InsertSingle, entry, MUIV_NList_Insert_Sorted);
- if (gui_napon) nap_sendbuf(NAPC_HOTLIST_ADD, entry->Nick);
- HotlistChanged = TRUE;
- }
- set(data->ST_Nick, MUIA_String_Contents, "");
- }
- return NULL;
- case HOTLIST_REMOVE:
- {
- struct HotlistEntry *entry;
- data = INST_DATA(cl, obj);
-
- DoMethod(data->LV_Hotlist, MUIM_NList_GetEntry, MUIV_NList_GetEntry_Active, &entry);
- if (entry && gui_napon) nap_sendbuf(NAPC_HOTLIST_REMOVE, entry->Nick);
-
- DoMethod(data->LV_Hotlist, MUIM_NList_Remove, MUIV_NList_Remove_Active);
- HotlistChanged = TRUE;
- return NULL;
- }
- case HOTLIST_BROWSE:
- {
- struct HotlistEntry *entry;
- long showresults;
- data = INST_DATA(cl, obj);
-
- get(data->TG_Results, MUIA_Selected, &showresults);
- if (!showresults) {
- set(data->LV_Search, MUIA_ShowMe, TRUE);
- set(data->TG_Results, MUIA_Selected, TRUE);
- }
-
- DoMethod(data->LV_Hotlist, MUIM_NList_GetEntry, MUIV_NList_GetEntry_Active, &entry);
- if (entry) DoMethod(data->LV_Search, RESULTVIEW_NICK, entry->Nick);
-
- return NULL;
- }
- case HOTLIST_NICK:
- {
- u_long tmp;
- data = INST_DATA(cl, obj);
-
- get(obj, MUIA_Window_Open, &tmp);
- if (!tmp) set(obj, MUIA_Window_Open, TRUE);
- /* Open the window if it's not already opened */
-
- get(data->TG_Results, MUIA_Selected, &tmp);
- if (!tmp) {
- set(data->LV_Search, MUIA_ShowMe, TRUE);
- set(data->TG_Results, MUIA_Selected, TRUE);
- }
-
- if ((char *)(((muimsg)msg)->arg1) == NULL) {
- GetAttr(MUIA_String_Acknowledge, data->ST_Nick, &tmp);
- if (tmp && ((char *)tmp)[0] != '\0') DoMethod(data->LV_Search, RESULTVIEW_NICK, (char *)tmp);
- }
- else DoMethod(data->LV_Search, RESULTVIEW_NICK, (char *)(((muimsg)msg)->arg1));
- return NULL;
- }
- case HOTLIST_FOUND:
- data = INST_DATA(cl, obj);
- DoMethod(data->LV_Search, RESULTVIEW_FOUND, ((muimsg)msg)->arg1);
- return NULL;
- case HOTLIST_TOGGLE_RESULTS:
- {
- u_long tmp;
- data = INST_DATA(cl, obj);
-
- GetAttr(MUIA_Selected, data->TG_Results, &tmp);
- if (tmp)
- set(data->LV_Search, MUIA_ShowMe, TRUE);
- else
- set(data->LV_Search, MUIA_ShowMe, FALSE);
- return NULL;
- }
- case HOTLIST_TOGGLE:
- data = INST_DATA(cl, obj);
- DoMethod(data->LV_Search, RESULTVIEW_TOGGLE_ONE);
- return NULL;
- }
-
- return(DoSuperMethodA(cl, obj, msg));
- }
-
-
- ULONG HotlistNew(struct IClass *cl, Object *obj, struct opSet *msg)
- {
- static const struct Hook HotlistDispHook = { {NULL, NULL}, &HotlistDisplay, NULL, NULL };
- static const struct Hook HotlistCompHook = { {NULL, NULL}, &HotlistCompare, NULL, NULL };
- static const struct Hook HotlistDestHook = { {NULL, NULL}, &HotlistDestruct, NULL, NULL };
-
- struct HotlistData *data;
-
- Object *LV_Hotlist, *LV_Search;
- Object *BT_Add, *BT_Remove;
- Object *ST_Nick, *BT_Browse;
- Object *TG_Results;
-
- gColFormat = "COL=1 BAR, COL=2 BAR, COL=3 BAR, COL=4 BAR, COL=5 BAR, COL=6 BAR";
-
- if (obj = (Object *)DoSuperNew(cl, obj,
- MUIA_HelpNode, "hotlist",
- MUIA_Window_Title, MSG_HOTLIST_TITLE,
- MUIA_Window_ID, MAKE_ID('H','O','T','L'),
- WindowContents, HGroup,
- Child, VGroup,
- MUIA_HorizWeight, 25,
- Child, NListviewObject,
- MUIA_NListview_NList, LV_Hotlist = NListObject,
- InputListFrame,
- MUIA_NList_ListBackground, MUII_ListBack,
- MUIA_NList_Title, TRUE,
- MUIA_NList_Format, "BAR,BAR,",
- MUIA_NList_DisplayHook, &HotlistDispHook,
- MUIA_NList_CompareHook2, &HotlistCompHook,
- MUIA_NList_DestructHook, &HotlistDestHook,
- End,
- End,
- Child, HGroup,
- Child, Label2(MSG_SEARCHUSER),
- Child, ST_Nick = StringObject,
- StringFrame,
- MUIA_HorizWeight, 400,
- MUIA_String_MaxLen, 20,
- MUIA_CycleChain, 1,
- MUIA_ShortHelp, MSG_SEARCHUSER_HELP,
- End,
- End,
- Child, HGroup,
- Child, BT_Add = SimpleButton(MSG_HOTLIST_ADD_GAD),
- Child, BT_Remove = SimpleButton(MSG_HOTLIST_REMOVE_GAD),
- Child, BT_Browse = SimpleButton(MSG_SEARCHUSER_GAD),
- End,
- Child, HGroup,
- Child, TextObject,
- MUIA_HorizWeight, 25,
- MUIA_Text_PreParse, "\33r",
- MUIA_Text_Contents, MSG_HOTLIST_RESULTS,
- End,
- Child, TG_Results = ImageObject,
- ButtonFrame,
- MUIA_HorizWeight, 10,
- MUIA_Background, MUII_ButtonBack,
- MUIA_InputMode, MUIV_InputMode_Toggle,
- MUIA_ShowSelState, FALSE,
- MUIA_Image_Spec, "6:15",
- MUIA_Selected, FALSE,
- End,
- End,
- End,
- Child, BalanceObject, End,
- Child, LV_Search = NewObject(gui->resultview_mcc->mcc_Class, NULL, TAG_DONE),
- End,
- TAG_MORE, msg->ops_AttrList))
- {
- data = INST_DATA(cl, obj);
- data->LV_Hotlist = LV_Hotlist;
- data->LV_Search = LV_Search;
- data->TG_Results = TG_Results;
- data->ST_Nick = ST_Nick;
-
- lamp_useinlist(LV_Hotlist);
-
- DoMethod(obj, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, obj, 3, MUIM_Set, MUIA_Window_Open, FALSE);
-
- DoMethod(BT_Add, MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, HOTLIST_ADD);
- DoMethod(BT_Remove, MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, HOTLIST_REMOVE);
- DoMethod(BT_Browse, MUIM_Notify, MUIA_Pressed, FALSE, obj, 2, HOTLIST_NICK, NULL);
- DoMethod(ST_Nick, MUIM_Notify, MUIA_String_Acknowledge, MUIV_EveryTime, obj, 2, HOTLIST_NICK, NULL);
-
- DoMethod(LV_Hotlist, MUIM_Notify, MUIA_NList_DoubleClick, MUIV_EveryTime, obj, 1, HOTLIST_BROWSE);
- DoMethod(TG_Results, MUIM_Notify, MUIA_Selected, MUIV_EveryTime, obj, 1, HOTLIST_TOGGLE_RESULTS);
-
- LoadHotlist(data);
-
- /* Default sort */
-
- DoMethod(LV_Hotlist, MUIM_Set, MUIA_NList_TitleMark, 1);
- DoMethod(LV_Hotlist, MUIM_NList_Sort3, 1, MUIV_NList_SortTypeAdd_2Values, MUIV_NList_Sort3_SortType_Both);
-
- DoMethod(LV_Hotlist, MUIM_Notify, MUIA_NList_TitleClick, MUIV_EveryTime, LV_Hotlist, 4, MUIM_NList_Sort3, MUIV_TriggerValue, MUIV_NList_SortTypeAdd_2Values, MUIV_NList_Sort3_SortType_Both);
- DoMethod(LV_Hotlist, MUIM_Notify, MUIA_NList_TitleClick2, MUIV_EveryTime, LV_Hotlist, 4, MUIM_NList_Sort3, MUIV_TriggerValue, MUIV_NList_SortTypeAdd_2Values, MUIV_NList_Sort3_SortType_2);
- DoMethod(LV_Hotlist, MUIM_Notify, MUIA_NList_SortType, MUIV_EveryTime, LV_Hotlist, 3, MUIM_Set, MUIA_NList_TitleMark, MUIV_TriggerValue);
- DoMethod(LV_Hotlist, MUIM_Notify, MUIA_NList_SortType2, MUIV_EveryTime, LV_Hotlist, 3, MUIM_Set, MUIA_NList_TitleMark2, MUIV_TriggerValue);
-
- set(data->LV_Search, MUIA_ShowMe, FALSE);
-
- return((ULONG)obj);
- }
- return(0);
- }
-
-
- MUIF HotlistDisplay(REG(a2) char **array, REG(a1) struct HotlistEntry *entry)
- {
- if (entry) {
- *array++ = entry->Nick;
- if (entry->Online) *array++ = "\33bOnline";
- else *array++ = "Offline";
- /*
- if (entry->Online) *array++ = lamp_getforlist(4);
- else *array++ = lamp_getforlist(2);
- */
- *array = nap_linktype[entry->Speed];
- }
- else {
- *array++ = (char *)MSG_HOTLIST_NICK;
- *array++ = (char *)MSG_HOTLIST_STATUS;
- *array = (char *)MSG_HOTLIST_LINK;
- }
-
- return NULL;
- }
-
-
- MUIF HotlistCompare(REG(a0) struct Hook *hook, REG(a2) Object *obj, REG(a1) struct NList_CompareMessage *ncm)
- {
- struct HotlistEntry *entry1 = ncm->entry1;
- struct HotlistEntry *entry2 = ncm->entry2;
- LONG col1 = ncm->sort_type & MUIV_NList_TitleMark_ColMask;
- LONG col2 = ncm->sort_type2 & MUIV_NList_TitleMark2_ColMask;
- ULONG result = 0;
-
- if (ncm->sort_type == MUIV_NList_SortType_None) return (0);
-
- if (col1 == 0) {
- if (ncm->sort_type & MUIV_NList_TitleMark_TypeMask)
- result = (LONG) stricmp(entry2->Nick, entry1->Nick);
- else
- result = (LONG) stricmp(entry1->Nick, entry2->Nick);
- }
- else if (col1 == 1) {
- if (ncm->sort_type & MUIV_NList_TitleMark_TypeMask)
- result = entry1->Online - entry2->Online;
- else
- result = entry2->Online - entry1->Online;
- }
- else if (col1 == 2) {
- if (ncm->sort_type & MUIV_NList_TitleMark_TypeMask)
- result = entry2->Speed - entry1->Speed;
- else
- result = entry1->Speed - entry2->Speed;
- }
-
- if ((result != 0) || (col1 == col2)) return (result);
-
- if (col2 == 0) {
- if (ncm->sort_type & MUIV_NList_TitleMark2_TypeMask)
- result = (LONG) stricmp(entry2->Nick, entry1->Nick);
- else
- result = (LONG) stricmp(entry1->Nick, entry2->Nick);
- }
- else if (col2 == 1) {
- if (ncm->sort_type & MUIV_NList_TitleMark2_TypeMask)
- result = entry1->Online - entry2->Online;
- else
- result = entry2->Online - entry1->Online;
- }
- else if (col2 == 2) {
- if (ncm->sort_type & MUIV_NList_TitleMark2_TypeMask)
- result = entry2->Speed - entry1->Speed;
- else
- result = entry1->Speed - entry2->Speed;
- }
-
- return (result);
- }
-
-
- MUIF HotlistDestruct(REG(a2) APTR pool, REG(a1) struct HotlistEntry *entry)
- {
- free(entry);
- return NULL;
- }
-
-
- void LoadHotlist(struct HotlistData *data)
- {
- BPTR fh;
- char buf[1024];
- int line = 0;
- struct HotlistEntry *entry;
- LONG argarray[] = { NULL, NULL };
- UBYTE *argstr = "NICK/K/A,SPEED/K/N";
- struct RDArgs *rdargs;
-
- if (fh = Open("PROGDIR:Amster.hotlist", MODE_OLDFILE)) {
- while (FGets(fh, buf, sizeof(buf))) {
- line++;
- if (rdargs = AllocDosObject(DOS_RDARGS, NULL)) {
- rdargs->RDA_Buffer = NULL;
- rdargs->RDA_Source.CS_Buffer = buf;
- rdargs->RDA_Source.CS_Length = strlen(buf);
- argarray[1] = NULL;
- if (ReadArgs(argstr, argarray, rdargs)) {
- if (entry = malloc(sizeof(struct HotlistEntry))) {
- entry->Nick = strdup((char *)argarray[0]);
- if (argarray[1]) entry->Speed = *((long *)argarray[1]);
- else entry->Speed = 0;
- entry->Online = 0;
- DoMethod(data->LV_Hotlist, MUIM_NList_InsertSingle, entry, MUIV_NList_Insert_Sorted);
-
- if (gui_napon) nap_sendbuf(NAPC_HOTLIST_INIT, entry->Nick);
- }
- }
- else gui_debugf((char *)MSG_PARSE_ERROR, "PROGDIR:Amster.hotlist", line);
- FreeDosObject(DOS_RDARGS, rdargs);
- }
- }
- Close(fh);
- DoMethod(data->LV_Hotlist, MUIM_NList_Sort);
- }
- }
-
-
- void SaveHotlist(struct HotlistData *data)
- {
- struct HotlistEntry *entry;
- BPTR fh;
- char buf[1024];
- int i;
-
- fh = Open("PROGDIR:Amster.hotlist", MODE_NEWFILE);
- if (!fh) return;
-
- for (i=0; ; i++) {
- DoMethod(data->LV_Hotlist, MUIM_NList_GetEntry, i, &entry);
- if (!entry) break;
- sprintf(buf, "NICK \"%s\" SPEED %d\n", entry->Nick, entry->Speed);
- Write(fh, buf, strlen(buf)); /* Should be buffered, check FWrite */
- }
-
- Close(fh);
- HotlistChanged = FALSE;
- }
-
-
- void UploadHotlist(struct HotlistData *data)
- {
- struct HotlistEntry *entry;
- int i;
-
- if (!gui_napon) return;
-
- for (i=0; ; i++) {
- DoMethod(data->LV_Hotlist, MUIM_NList_GetEntry, i, &entry);
- if (!entry) break;
- nap_sendbuf(NAPC_HOTLIST_INIT, entry->Nick);;
- }
- }
-
-
- void HotlistInterpret(u_int com, char *data)
- {
- char *nick;
- int speed;
-
- switch(com) {
- case NAPC_USER_SIGNON:
- nick = nap_token(&data);
- speed = atoi(data);
- DoMethod(gui->WI_Hotlist, HOTLIST_SIGNON, nick, speed);
- break;
- case NAPC_USER_SIGNOFF:
- gui_debugf((char *)MSG_INFO_SIGNOFF, data);
- DoMethod(gui->WI_Hotlist, HOTLIST_SIGNOFF, data);
- break;
- case NAPC_HOTLIST_ACK:
- break;
- case NAPC_HOTLIST_ERROR:
- gui_debugf("Error adding %s to hotlist", data);
- break;
- }
- }
-
-
- struct HotlistEntry *GetHotlistEntry(struct HotlistData *data, char *nick)
- {
- struct HotlistEntry *entry;
- int i;
-
- for (i=0; ; i++) {
- DoMethod(data->LV_Hotlist, MUIM_NList_GetEntry, i, &entry);
- if (!entry) return NULL;
- if (stricmp(entry->Nick, nick) == 0) break;
- }
-
- return entry;
- }
-