void OutputView::_SetFileNameExtension(const char* newExtension) { // TODO: If fFileExtension contains the wrong extension // (for example if the user renamed the file manually) // this will fail. For example, outputfile.avi, but // fFileExtension is mkv -> outputfile.avi.mkv BString fileName = fFileName->Text(); BString extension = "."; extension.Append(fFileExtension); fileName.RemoveLast(extension); fFileExtension = newExtension; fileName.Append("."); fileName.Append(fFileExtension); fFileName->SetText(fileName.String()); }
void MessageWindow::TabExpansion (void) { int32 start, finish; input->TextView()->GetSelection (&start, &finish); if (input->TextView()->TextLength() && start == finish && start == input->TextView()->TextLength()) { const char *inputText ( input->TextView()->Text() + input->TextView()->TextLength()); const char *place (inputText); while (place > input->TextView()->Text()) { if (*(place - 1) == '\x20') break; --place; } BString insertion; if (!id.ICompare (place, strlen (place))) { insertion = id; insertion.RemoveLast(" [DCC]"); } if (insertion.Length()) { input->TextView()->Delete ( place - input->TextView()->Text(), input->TextView()->TextLength()); input->TextView()->Insert (insertion.String()); input->TextView()->Select ( input->TextView()->TextLength(), input->TextView()->TextLength()); } } }
bool EthernetSettingsView::_ValidateControl(BTextControl* control) { static const char* pattern = "^(25[0-5]|2[0-4][0-9]|[01][0-9]{2}|[0-9]" "{1,2})(\\.(25[0-5]|2[0-4][0-9]|[01][0-9]{2}|[0-9]{1,2})){3}$"; if (control->IsEnabled() && !MatchPattern(control->Text(), pattern)) { control->MakeFocus(); BString errorMessage; errorMessage << control->Label(); errorMessage.RemoveLast(":"); errorMessage << " is invalid"; fErrorMessage->SetText(errorMessage.String()); beep(); return false; } return true; }
//--------------------------------------------------------------- int main(int32 argc, char** argv) { //We save the execDir to the settings file BPath path; BString tmp; MSave savefile("savefile"); find_directory(B_COMMON_SETTINGS_DIRECTORY, &path); tmp.SetTo(path.Path()); tmp.Append(SAVE_SETTINGS_PATH); path.SetTo(tmp.String()); tmp.SetTo(argv[0]); tmp.RemoveLast(STR_EXEC_FILE_NAME); savefile.AddString(path, SAVE_FILE_NAME, NAME_EXEC_DIR, tmp.String(), true); new mApp(); be_app->Run(); return(0); }
void SourceFileRez::RemoveObjects(BuildInfo &info) { if (BString(GetPath().GetExtension()).ICompare("r") != 0) return; DPath path(GetTempFilePath(info)); BString base = path.GetFolder(); base << "/" << path.GetBaseName() << ".txt"; BEntry(base.String()).Remove(); base = path.GetFolder(); base << "/" << path.GetBaseName(); base.RemoveLast(".r"); base << ".rsrc"; BEntry(base.String()).Remove(); }
/*static*/ void Playlist::AppendPlaylistToPlaylist(const entry_ref& ref, Playlist* playlist) { BEntry entry(&ref, true); if (entry.InitCheck() != B_OK || !entry.Exists()) return; BString mimeString = _MIMEString(&ref); if (_IsTextPlaylist(mimeString)) { //printf("RunPlaylist thing\n"); BFile file(&ref, B_READ_ONLY); FileReadWrite lineReader(&file); BString str; entry_ref refPath; status_t err; BPath path; while (lineReader.Next(str)) { str = str.RemoveFirst("file://"); str = str.RemoveLast(".."); path = BPath(str.String()); printf("Line %s\n", path.Path()); if (path.Path() != NULL) { if ((err = get_ref_for_path(path.Path(), &refPath)) == B_OK) { PlaylistItem* item = new (std::nothrow) FilePlaylistItem(refPath); if (item == NULL || !playlist->AddItem(item)) delete item; } else printf("Error - %s: [%lx]\n", strerror(err), (int32) err); } else printf("Error - No File Found in playlist\n"); } } else if (_IsBinaryPlaylist(mimeString)) { BFile file(&ref, B_READ_ONLY); Playlist temp; if (temp.Unflatten(&file) == B_OK) playlist->AdoptPlaylist(temp, playlist->CountItems()); } }
// Mounts the specified image file (filename) assuming it contains the // specified file system. int app::MountImage(const char *filename, const char *filesystem) { int timeout=3; int retvalue; BString mountpoint; BEntry entry; int mountpoint_counter=0; do { mountpoint="/"; mountpoint.Append(FindMountPointName(filename)); while (mountpoint[mountpoint.Length()-1]==0x20) mountpoint.RemoveLast(" "); if (mountpoint_counter>0) mountpoint << " " << mountpoint_counter; entry.SetTo(mountpoint.String()); mountpoint_counter++; } while(entry.Exists()); CreateDirectory(mountpoint.String()); while ((retvalue=mount(filesystem,mountpoint.String(),filename,2,NULL,0))<0) { snooze(100000); // omg! ;) timeout--; if (timeout==0) { entry.Remove(); mountpoint_counter--; entry.Unset(); return -1; } }; printf("mounted.\nfilename:\t%s\nfilesystem:\t%s\nmountpoint:\t%s\n", filename, filesystem, mountpoint.String()); if (retvalue<0) { entry.Remove(); mountpoint_counter--; } entry.Unset(); return retvalue; }
status_t TConfigFile::Load() { int32 textlen; char text[2048], *value; BString buff; config_t *item; FILE *fd = fopen(fPathName.String(), "r"); if (!fd) return errno; while (!feof(fd)) { if (fgets(text, sizeof(text), fd) == NULL) break; buff.Append(text); textlen = strlen(text); if (text[textlen - 1] == '\n') { buff.RemoveLast("\n"); value = strchr(buff.String(), ' '); if (value != NULL) { if ((item = (config_t *)calloc(sizeof(config_t), 1)) == NULL) { fclose(fd); return ENOMEM; } if (!fList.AddItem(item)) { free(item); fclose(fd); return ENOMEM; } *value = 0; value++; strncpy(item->key, buff.String(), sizeof(item->key)); strncpy(item->value, value, sizeof(item->value)); } buff.SetTo(""); } } fclose(fd); return B_OK; }
//--------------------------------------------------------------- void ExportWindow::MainLoop() { BString fFilePath; BString fFolderPath; BString fFileName; BPath Path; BEntry Entry("/boot/home"); MSave Load("Load"); find_directory(B_COMMON_SETTINGS_DIRECTORY, &Path); fFolderPath.SetTo(Path.Path()); fFolderPath.Append(SAVE_NOTE_PATH); for (int a = 1; a <= 31; a++) { fFileName.SetTo(""); fFileName << a << "-" << fMonth << fYear << "-"; for (int b = 1; b <= INT_MAXFILES; b++) { fFileName << b; fFilePath.SetTo(fFolderPath); fFilePath << fFileName.String(); Entry.SetTo(fFilePath.String()); if (Entry.Exists()) { Load.FindString(fFilePath.String(), SAVE_FILE_TYPE, &fType, "M_ERROR"); if (!strcmp(fType.String(), "Note") || !strcmp(fType.String(), "Apointment")) { //Add the date if it is the first note/apointment of this day if (fFirstNoteOfTheDay) { fContent << "<table width=450 color=\"#FFFFFF\">\n"; fContent << "<h2>" << a << "." << fMonth << "-" << fYear << "</h2>\n"; fFirstNoteOfTheDay = false; } //Change the color if (!strcmp(TableColor.String(), TableBGColor1.String())) { TableColor.SetTo(TableBGColor2); } else { TableColor.SetTo(TableBGColor1); } } //Its a note if (!strcmp(fType.String(), "Note") && _ExportView->mNoteCheckBox->Value()) { Load.FindString(fFilePath.String(), SAVE_FILE_NOTE, &fNote, "M_ERROR"); Load.FindString(fFilePath.String(), SAVE_FILE_TITLE, &fTitle, "M_ERROR"); fContent << "<tr><td bgcolor=\"" << TableColor.String() << "\" width=430>\n"; fContent << "<h4>"<< fTitle.String() << "</h4>"; fNote.ReplaceAll("\n", "<br>"); fContent << fNote.String() << "\n"; fContent << "</tr></td>\n"; } //Its an apointment if (!strcmp(fType.String(), "Apointment") && _ExportView->mApointmentCheckBox->Value()) { Load.FindString(fFilePath.String(), SAVE_FILE_NOTE, &fNote, "M_ERROR"); Load.FindString(fFilePath.String(), SAVE_FILE_TITLE, &fTitle, "M_ERROR"); Load.FindString(fFilePath.String(), SAVE_FILE_TIME, &fTime, "M_ERROR"); fContent << "<tr><td bgcolor=\"" << TableColor.String() << "\" width=430>\n"; fContent << "<h4>"<< fTitle.String() << ""; tmpString.SetTo(fTime); tmpString.Remove(0, tmpString.FindFirst(":") + 1); if (tmpString.CountChars() == 1) { fTime.RemoveLast(tmpString.String()); fTime.Append("0"); fTime.Append(tmpString.String()); } fContent << " "<< fTime.String() << "</h4>\n"; fNote.ReplaceAll("\n", "<br>"); fContent << fNote.String() << "\n"; fContent << "</tr></td>\n"; } } tmpString.SetTo(""); tmpString << b; fFileName.RemoveLast(tmpString.String()); } if (!fFirstNoteOfTheDay) { fContent << "</table>\n"; fContent << "<br>"; } fFirstNoteOfTheDay = true; } }
int main(int argc, char** argv) { if (argc < 2) { printf("usage: %s [-l|-c|decorname]\n", argv[0]); printf("\t-l: list available decors\n"); printf("\t-s: list shortcut names for available decors\n"); printf("\t-c: give current decor name\n"); printf("\t-i: detailed information about decor\n"); printf("\t-p: see preview window\n"); return 1; } // combine remaining args into one string: BString decoratorName; for (int i = 2; i < argc; ++i) decoratorName << argv[i] << " "; decoratorName.RemoveLast(" "); BApplication app("application/x-vnd.Haiku-setdecor"); DecorInfoUtility* util = new DecorInfoUtility(); DecorInfo* decor = NULL; if (util == NULL) { fprintf(stderr, "error instantiating DecoratorInfoUtility (out of" " memory?)\n"); return 1; } // we want the list if (!strcmp(argv[1], "-l")) { // Print default decorator: print_decor_info_header(); int32 count = util->CountDecorators(); for (int32 i = 0; i < count; ++i) { decor = util->DecoratorAt(i); if (decor == NULL) { fprintf(stderr, "error NULL entry @ %li / %li - BUG BUG BUG\n", i, count); // return 2 to track DecorInfoUtility errors return 2; } print_decor_summary(decor, util->IsCurrentDecorator(decor)); } return 0; } // we want the current decorator if (!strcmp(argv[1], "-c")) { decor = util->CurrentDecorator(); if (decor == NULL) { fprintf(stderr, "Unable to determine current decorator, sorry! - " "BUG BUG BUG\n"); return 2; } print_decor_info_header(); print_decor_summary(decor, true); return 0; } if (!strcmp(argv[1], "-s")) { printf(" Shortcut Name\n"); printf("------------------------------------\n"); int32 count = util->CountDecorators(); for (int32 i = 0; i < count; ++i) { decor = util->DecoratorAt(i); if (decor == NULL) { fprintf(stderr, "error NULL entry @ %li / %li - BUG BUG BUG\n", i, count); // return 2 to track DecorInfoUtility errors return 2; } print_decor_shortcut(decor, util->IsCurrentDecorator(decor)); } return 0; } // we want detailed information for a specific decorator ( by name or path ) if (!strcmp(argv[1], "-i")) { if (argc < 3) { fprintf(stderr, "not enough arguments\n"); return 1; } decor = util->FindDecorator(decoratorName.String()); if (decor == NULL) { fprintf(stderr, "Can't find decor named \"%s\", try again\n", decoratorName.String()); return 1; } print_decor_info_verbose(decor, util->IsCurrentDecorator(decor)); return 0; } if (!strcmp(argv[1], "-p")) { if (argc < 3) { fprintf(stderr, "not enough arguments\n"); return 1; } decor = util->FindDecorator(decoratorName.String()); if (decor == NULL) { fprintf(stderr, "Can't find decor named \"%s\", try again\n", decoratorName.String()); return 1; } printf("Preparing preview...\n"); BWindow* previewWindow = new BWindow(BRect(150, 150, 390, 490), decor->Name().String(), B_TITLED_WINDOW, B_NOT_ZOOMABLE | B_QUIT_ON_WINDOW_CLOSE | B_NOT_RESIZABLE ); previewWindow->AddChild(new BView(previewWindow->Bounds(), "", B_FOLLOW_ALL, 0)); if (util->Preview(decor, previewWindow) != B_OK) { fprintf(stderr, "Unable to preview decorator, sorry!\n"); // TODO: more detailed error... return 1; } previewWindow->Show(); app.Run(); return 0; } // we want to change it decoratorName = ""; for (int i = 1; i < argc; ++i) decoratorName << argv[i] << " "; decoratorName.RemoveLast(" "); decor = util->FindDecorator(decoratorName.String()); if (decor == NULL) { fprintf(stderr, "no such decorator \"%s\"\n", decoratorName.String()); return 1; } if (util->IsCurrentDecorator(decor)) { printf("\"%s\" is already the current decorator\n", decor->Name().String()); return 0; } printf("Setting %s as the current decorator...\n", decor->Name().String()); if (util->SetDecorator(decor) != B_OK ) { fprintf(stderr, "Unable to set decorator, sorry\n\n"); return 1; // todo more detailed error... } return 0; }
void SourceFileC::UpdateDependencies(BuildInfo &info) { BString abspath = GetPath().GetFullPath(); if (abspath[0] != '/') { abspath.Prepend("/"); abspath.Prepend(info.projectFolder.GetFullPath()); } BString command; if (gUseFastDep && gFastDepAvailable) command << "fastdep " << info.includeString << " '" << abspath.String() << "'"; else command << "gcc -MM " << info.includeString << " '" << abspath.String() << "'"; BString depstr; RunPipedCommand(command.String(), depstr, true); STRACE(1,("Update Dependencies for %s\nCommand:%s\nOutput:%s\n", GetPath().GetFullPath(),command.String(),depstr.String())); if (gUseFastDep && gFastDepAvailable) { if (depstr.FindFirst("error ") == 0) { int32 index, startpos = 0; index = depstr.FindFirst("error ", startpos); while (index >= 0) { startpos = index + 6; index = depstr.FindFirst("error ", startpos); } index = depstr.FindFirst("\n") + 1; depstr = depstr.String() + index; } // The first part of the dependency string should be FileName.o: int32 secondlinepos = depstr.FindFirst("\n") + 1; BString tempstr = depstr; depstr = tempstr.String() + secondlinepos; depstr.ReplaceAll(" \\\n\t","|"); if (depstr.FindLast("\n") == depstr.CountChars() - 1) depstr.RemoveLast("\n"); if (depstr.FindFirst(" ") == 0) depstr.RemoveFirst(" "); fDependencies = depstr; } else { // The reason that all of this works is because the absolute paths force // each file to be on a separate line. Going with relative paths is FAR more // of a headache than I want to mess with. Bleah. if (depstr.FindFirst(" warning: ") >= 0) { int32 index, startpos = 0; index = depstr.FindFirst(" warning: ", startpos); while (index >= 0) { startpos = index + 10; index = depstr.FindFirst(" warning: ", startpos); } index = depstr.FindFirst("\n") + 1; depstr = depstr.String() + index; } // The first part of the dependency string should be FileName.o: BString objfilename = GetPath().GetBaseName(); objfilename << ".o: "; int32 filenamepos = depstr.FindFirst(objfilename.String()); if (filenamepos == 0) { int32 lineend = depstr.FindFirst("\n",filenamepos); if (lineend >= 0) fDependencies = depstr.String() + lineend + 2; } else fDependencies = depstr.String(); fDependencies.RemoveSet("\\\n"); fDependencies.ReplaceAll(" ","|"); fDependencies.ReplaceAll("| ","|"); if (fDependencies[0] == ' ') fDependencies.RemoveFirst(" "); } }
bool ClientWindow::ParseCmd (const char *data) { BString firstWord (GetWord(data, 1).ToUpper()); if (firstWord == "/WALLOPS" // we need to insert a ':' before parm2 || firstWord == "/SQUIT" // for the user || firstWord == "/PRIVMSG") { BString theCmd (firstWord.RemoveAll ("/")), theRest (RestOfString (data, 2)); BMessage send (M_SERVER_SEND); AddSend (&send, theCmd); if (theRest != "-9z99") { AddSend (&send, " :"); AddSend (&send, theRest); } AddSend (&send, endl); return true; } if (firstWord == "/KILL") // we need to insert a ':' before parm3 { // for the user BString theCmd (firstWord.RemoveAll ("/")), theTarget (GetWord (data, 2)), theRest (RestOfString (data, 3)); BMessage send (M_SERVER_SEND); AddSend (&send, theCmd); AddSend (&send, " "); AddSend (&send, theTarget); if (theRest != "-9z99") { AddSend (&send, " :"); AddSend (&send, theRest); } AddSend (&send, endl); return true; } // some quick aliases for scripts, these will of course be // moved to an aliases section eventually if (firstWord == "/SOUNDPLAY" || firstWord == "/CL-AMP") { app_info ai; be_app->GetAppInfo (&ai); BEntry entry (&ai.ref); BPath path; entry.GetPath (&path); path.GetParent (&path); //path.Append ("data"); path.Append ("scripts"); if (firstWord == "/SOUNDPLAY") path.Append ("soundplay-hey"); else path.Append ("cl-amp-clr"); BMessage *msg (new BMessage); msg->AddString ("exec", path.Path()); msg->AddPointer ("client", this); thread_id execThread = spawn_thread ( ExecPipe, "exec_thread", B_LOW_PRIORITY, msg); resume_thread (execThread); return true; } if (firstWord == "/ABOUT") { be_app_messenger.SendMessage (B_ABOUT_REQUESTED); return true; } if (firstWord == "/AWAY") { BString theReason (RestOfString (data, 2)); BString tempString; if (theReason != "-9z99") { //nothing to do } else { theReason = "BRB"; // Todo: make a default away msg option } const char *expansions[1]; expansions[0] = theReason.String(); tempString = ExpandKeyed (bowser_app->GetCommand (CMD_AWAY).String(), "R", expansions); tempString.RemoveFirst("\n"); BMessage send (M_SERVER_SEND); AddSend (&send, "AWAY"); AddSend (&send, " :"); AddSend (&send, theReason.String()); AddSend (&send, endl); if (id != serverName) { ActionMessage (tempString.String(), myNick.String()); } return true; } if (firstWord == "/BACK") { BMessage send (M_SERVER_SEND); AddSend (&send, "AWAY"); AddSend (&send, endl); if (id != serverName) { ActionMessage ( bowser_app->GetCommand (CMD_BACK).String(), myNick.String()); } return true; } if (firstWord == "/CHANSERV" || firstWord == "/NICKSERV" || firstWord == "/MEMOSERV") { BString theCmd (firstWord.RemoveFirst ("/")), theRest (RestOfString (data, 2)); theCmd.ToLower(); if (theRest != "-9z99") { if (bowser_app->GetMessageOpenState()) { BMessage msg (OPEN_MWINDOW); BMessage buffer (M_SUBMIT); buffer.AddString ("input", theRest.String()); msg.AddMessage ("msg", &buffer); msg.AddString ("nick", theCmd.String()); sMsgr.SendMessage (&msg); } else { BString tempString; tempString << "[M]-> " << theCmd << " > " << theRest << "\n"; Display (tempString.String(), 0); BMessage send (M_SERVER_SEND); AddSend (&send, "PRIVMSG "); AddSend (&send, theCmd); AddSend (&send, " :"); AddSend (&send, theRest); AddSend (&send, endl); } } return true; } if (firstWord == "/CLEAR") { text->ClearView (false); return true; } if (firstWord == "/FCLEAR") { text->ClearView (true); return true; } if (firstWord == "/CTCP") { BString theTarget (GetWord (data, 2)); BString theAction (RestOfString (data, 3)); if (theAction != "-9z99") { theAction.ToUpper(); if (theAction.ICompare ("PING") == 0) { time_t now (time (0)); theAction << " " << now; } CTCPAction (theTarget, theAction); BMessage send (M_SERVER_SEND); AddSend (&send, "PRIVMSG "); AddSend (&send, theTarget << " :\1" << theAction << "\1"); AddSend (&send, endl); } return true; } if (firstWord == "/DCC") { BString secondWord (GetWord (data, 2)); BString theNick (GetWord (data, 3)); BString theFile (RestOfString(data, 4)); if (secondWord.ICompare ("SEND") == 0 && theNick != "-9z99") { BMessage *msg (new BMessage (CHOSE_FILE)); msg->AddString ("nick", theNick.String()); if (theFile != "-9z99") { char filePath[B_PATH_NAME_LENGTH] = "\0"; if (theFile.ByteAt(0) != '/') { find_directory(B_USER_DIRECTORY, 0, false, filePath, B_PATH_NAME_LENGTH); filePath[strlen(filePath)] = '/'; } strcat(filePath, theFile.LockBuffer(0)); theFile.UnlockBuffer(); // use BPath to resolve relative pathnames, above code forces it // to use /boot/home as a working dir as opposed to the app path BPath sendPath(filePath, NULL, true); // the BFile is used to verify if the file exists // based off the documentation get_ref_for_path *should* // return something other than B_OK if the file doesn't exist // but that doesn't seem to be working correctly BFile sendFile(sendPath.Path(), B_READ_ONLY); // if the file exists, send, otherwise drop to the file panel if (sendFile.InitCheck() == B_OK) { sendFile.Unset(); entry_ref ref; get_ref_for_path(sendPath.Path(), &ref); msg->AddRef("refs", &ref); sMsgr.SendMessage(msg); return true; } } BFilePanel *myPanel (new BFilePanel); BString myTitle ("Sending a file to "); myTitle.Append (theNick); myPanel->Window()->SetTitle (myTitle.String()); myPanel->SetMessage (msg); myPanel->SetButtonLabel (B_DEFAULT_BUTTON, "Send"); myPanel->SetTarget (sMsgr); myPanel->Show(); } else if (secondWord.ICompare ("CHAT") == 0 && theNick != "-9z99") { BMessage msg (CHAT_ACTION); msg.AddString ("nick", theNick.String()); sMsgr.SendMessage (&msg); } return true; } if (firstWord == "/DOP" || firstWord == "/DEOP") { BString theNick (RestOfString (data, 2)); if (theNick != "-9z99") { BMessage send (M_SERVER_SEND); AddSend (&send, "MODE "); AddSend (&send, id); AddSend (&send, " -oooo "); AddSend (&send, theNick); AddSend (&send, endl); } return true; } if (firstWord == "/DESCRIBE") { BString theTarget (GetWord (data, 2)); BString theAction (RestOfString (data, 3)); if (theAction != "-9z99") { BMessage send (M_SERVER_SEND); AddSend (&send, "PRIVMSG "); AddSend (&send, theTarget); AddSend (&send, " :\1ACTION "); AddSend (&send, theAction); AddSend (&send, "\1"); AddSend (&send, endl); BString theActionMessage ("[ACTION]-> "); theActionMessage << theTarget << " -> " << theAction << "\n"; Display (theActionMessage.String(), 0); } return true; } if (firstWord == "/DNS") { BString parms (GetWord(data, 2)); ChannelWindow *window; MessageWindow *message; if ((window = dynamic_cast<ChannelWindow *>(this))) { int32 count (window->namesList->CountItems()); for (int32 i = 0; i < count; ++i) { NameItem *item ((NameItem *)(window->namesList->ItemAt (i))); if (!item->Name().ICompare (parms.String(), strlen (parms.String()))) //nick { BMessage send (M_SERVER_SEND); AddSend (&send, "USERHOST "); AddSend (&send, item->Name().String()); AddSend (&send, endl); PostMessage(&send); return true; } } } else if ((message = dynamic_cast<MessageWindow *>(this))) { BString eid (id); eid.RemoveLast (" [DCC]"); if (!ICompare(eid, parms) || !ICompare(myNick, parms)) { BMessage send (M_SERVER_SEND); AddSend (&send, "USERHOST "); AddSend (&send, parms.String()); AddSend (&send, endl); PostMessage(&send); return true; } } if (parms != "-9z99") { BMessage *msg (new BMessage); msg->AddString ("lookup", parms.String()); msg->AddPointer ("client", this); thread_id lookupThread = spawn_thread ( DNSLookup, "dns_lookup", B_LOW_PRIORITY, msg); resume_thread (lookupThread); } return true; } if (firstWord == "/PEXEC") // piped exec { BString theCmd (RestOfString (data, 2)); if (theCmd != "-9z99") { BMessage *msg (new BMessage); msg->AddString ("exec", theCmd.String()); msg->AddPointer ("client", this); thread_id execThread = spawn_thread ( ExecPipe, "exec_thread", B_LOW_PRIORITY, msg); resume_thread (execThread); } return true; } if (firstWord == "/EXCLUDE") { BString second (GetWord (data, 2)), rest (RestOfString (data, 3)); if (rest != "-9z99" && rest != "-9z99") { BMessage msg (M_EXCLUDE_COMMAND); msg.AddString ("second", second.String()); msg.AddString ("cmd", rest.String()); msg.AddString ("server", serverName.String()); msg.AddRect ("frame", Frame()); bowser_app->PostMessage (&msg); } return true; } if (firstWord == "/IGNORE") { BString rest (RestOfString (data, 2)); if (rest != "-9z99") { BMessage msg (M_IGNORE_COMMAND); msg.AddString ("cmd", rest.String()); msg.AddString ("server", serverName.String()); msg.AddRect ("frame", Frame()); bowser_app->PostMessage (&msg); } return true; } if (firstWord == "/INVITE" || firstWord == "/I") { BString theUser (GetWord (data, 2)); if (theUser != "-9z99") { BString theChan (GetWord (data, 3)); if (theChan == "-9z99") theChan = id; BMessage send (M_SERVER_SEND); AddSend (&send, "INVITE "); AddSend (&send, theUser << " " << theChan); AddSend (&send, endl); } return true; } if (firstWord == "/JOIN" || firstWord == "/J") { BString channel (GetWord (data, 2)); if (channel != "-9z99") { if (channel[0] != '#' && channel[0] != '&') channel.Prepend("#"); BMessage send (M_SERVER_SEND); AddSend (&send, "JOIN "); AddSend (&send, channel); BString key (GetWord (data, 3)); if (key != "-9z99") { AddSend (&send, " "); AddSend (&send, key); } AddSend (&send, endl); } return true; } if (firstWord == "/KICK" || firstWord == "/K") { BString theNick (GetWord (data, 2)); if (theNick != "-9z99") { BString theReason (RestOfString (data, 3)); if (theReason == "-9z99") { // No expansions theReason = bowser_app ->GetCommand (CMD_KICK); } BMessage send (M_SERVER_SEND); AddSend (&send, "KICK "); AddSend (&send, id); AddSend (&send, " "); AddSend (&send, theNick); AddSend (&send, " :"); AddSend (&send, theReason); AddSend (&send, endl); } return true; } if (firstWord == "/LIST") { BMessage msg (M_LIST_COMMAND); msg.AddString ("cmd", data); msg.AddString ("server", serverName.String()); msg.AddRect ("frame", Frame()); bowser_app->PostMessage (&msg); return true; } if (firstWord == "/M") { BString theMode (RestOfString (data, 2)); BMessage send (M_SERVER_SEND); AddSend (&send, "MODE "); if (id == serverName) AddSend (&send, myNick); else if (id[0] == '#' || id[0] == '&') AddSend (&send, id); else AddSend (&send, myNick); if (theMode != "-9z99") { AddSend (&send, " "); AddSend (&send, theMode); } AddSend (&send, endl); return true; } if (firstWord == "/ME") { BString theAction (RestOfString (data, 2)); if (theAction != "-9z99") { ActionMessage (theAction.String(), myNick.String()); } return true; } if (firstWord == "/MODE") { BString theMode (RestOfString (data, 3)); BString theTarget (GetWord (data, 2)); if (theTarget != "-9z99") { BMessage send (M_SERVER_SEND); AddSend (&send, "MODE "); if (theMode == "-9z99") AddSend (&send, theTarget); else AddSend (&send, theTarget << " " << theMode); AddSend (&send, endl); } return true; } if (firstWord == "/MSG") { BString theRest (RestOfString (data, 3)); BString theNick (GetWord (data, 2)); if (theRest != "-9z99" && myNick.ICompare (theNick)) { if (bowser_app->GetMessageOpenState()) { BMessage msg (OPEN_MWINDOW); BMessage buffer (M_SUBMIT); buffer.AddString ("input", theRest.String()); msg.AddMessage ("msg", &buffer); msg.AddString ("nick", theNick.String()); sMsgr.SendMessage (&msg); } else { BString tempString; tempString << "[M]-> " << theNick << " > " << theRest << "\n"; Display (tempString.String(), 0); BMessage send (M_SERVER_SEND); AddSend (&send, "PRIVMSG "); AddSend (&send, theNick); AddSend (&send, " :"); AddSend (&send, theRest); AddSend (&send, endl); } } return true; } if (firstWord == "/NICK") { BString newNick (GetWord (data, 2)); if (newNick != "-9z99") { BString tempString ("*** Trying new nick "); tempString << newNick << ".\n"; Display (tempString.String(), 0); BMessage send (M_SERVER_SEND); AddSend (&send, "NICK "); AddSend (&send, newNick); AddSend (&send, endl); } return true; } if (firstWord == "/NOTICE") { BString theTarget (GetWord (data, 2)); BString theMsg (RestOfString (data, 3)); if (theMsg != "-9z99") { BMessage send (M_SERVER_SEND); AddSend (&send, "NOTICE "); AddSend (&send, theTarget); AddSend (&send, " :"); AddSend (&send, theMsg); AddSend (&send, endl); BString tempString ("[N]-> "); tempString << theTarget << " -> " << theMsg << '\n'; Display (tempString.String(), 0); } return true; } if (firstWord == "/NOTIFY") { BString rest (RestOfString (data, 2)); if (rest != "-9z99") { BMessage msg (M_NOTIFY_COMMAND); msg.AddString ("cmd", rest.String()); msg.AddBool ("add", true); msg.AddString ("server", serverName.String()); msg.AddRect ("frame", Frame()); bowser_app->PostMessage (&msg); } return true; } if (firstWord == "/OP") { BString theNick (RestOfString (data, 2)); if (theNick != "-9z99") { // TODO only applies to a channel BMessage send (M_SERVER_SEND); AddSend (&send, "MODE "); AddSend (&send, id); AddSend (&send, " +oooo "); AddSend (&send, theNick); AddSend (&send, endl); } return true; } if (firstWord == "/PART") { BMessage msg (B_QUIT_REQUESTED); msg.AddBool ("bowser:part", true); PostMessage (&msg); return true; } if (firstWord == "/PING") { BString theNick (GetWord (data, 2)); if (theNick != "-9z99") { long theTime (time (0)); BString tempString ("/CTCP "); tempString << theNick << " PING " << theTime; SlashParser (tempString.String()); } return true; } if (firstWord == "/PREFERENCES") { be_app_messenger.SendMessage (M_PREFS_BUTTON); return true; } if (firstWord == "/QUERY" || firstWord == "/Q") { BString theNick (GetWord (data, 2)); if (theNick != "-9z99") { BMessage msg (OPEN_MWINDOW); msg.AddString ("nick", theNick.String()); sMsgr.SendMessage (&msg); } return true; } if (firstWord == "/QUIT") { BString theRest (RestOfString (data, 2)); BString buffer; if (theRest == "-9z99") { const char *expansions[1]; BString version (bowser_app->BowserVersion()); expansions[0] = version.String(); theRest = ExpandKeyed (bowser_app ->GetCommand (CMD_QUIT).String(), "V", expansions); } buffer << "QUIT :" << theRest; BMessage msg (B_QUIT_REQUESTED); msg.AddString ("bowser:quit", buffer.String()); sMsgr.SendMessage (&msg); return true; } if (firstWord == "/RAW" || firstWord == "/QUOTE") { BString theRaw (RestOfString (data, 2)); if (theRaw != "-9z99") { BMessage send (M_SERVER_SEND); AddSend (&send, theRaw); AddSend (&send, endl); BString tempString ("[R]-> "); tempString << theRaw << '\n'; Display (tempString.String(), 0); } return true; } if (firstWord == "/RECONNECT") { BMessage msg (M_SLASH_RECONNECT); msg.AddString ("server", serverName.String()); bowser_app->PostMessage (&msg); return true; } if (firstWord == "/SLEEP") { BString rest (RestOfString (data, 2)); if (rest != "-9z99") { // this basically locks up the window its run from, // but I can't think of a better way with our current // commands implementation int32 time = atoi(rest.String()); snooze(time * 1000 * 100); // deciseconds? 10 = one second } return true; } if (firstWord == "/TOPIC" || firstWord == "/T") { BString theChan (id); BString theTopic (RestOfString (data, 2)); BMessage send (M_SERVER_SEND); AddSend (&send, "TOPIC "); if (theTopic == "-9z99") AddSend (&send, theChan); else AddSend (&send, theChan << " :" << theTopic); AddSend (&send, endl); return true; } if (firstWord == "/UNIGNORE") { BString rest (RestOfString (data, 2)); if (rest != "-9z99") { BMessage msg (M_UNIGNORE_COMMAND); msg.AddString ("cmd", rest.String()); msg.AddString ("server", serverName.String()); msg.AddRect ("frame", Frame()); bowser_app->PostMessage (&msg); } return true; } if (firstWord == "/UNNOTIFY") { BString rest (RestOfString (data, 2)); if (rest != "-9z99") { BMessage msg (M_NOTIFY_COMMAND); msg.AddString ("cmd", rest.String()); msg.AddBool ("add", false); msg.AddRect ("frame", Frame()); msg.AddString ("server", serverName.String()); bowser_app->PostMessage (&msg); } return true; } if (firstWord == "/UPTIME") { BString parms (GetWord(data, 2)); BString uptime (DurationString(system_time())); BString expandedString; const char *expansions[1]; expansions[0] = uptime.String(); expandedString = ExpandKeyed (bowser_app->GetCommand (CMD_UPTIME).String(), "U", expansions); expandedString.RemoveFirst("\n"); if ((id != serverName) && (parms == "-9z99")) { BMessage send (M_SERVER_SEND); AddSend (&send, "PRIVMSG "); AddSend (&send, id); AddSend (&send, " :"); AddSend (&send, expandedString.String()); AddSend (&send, endl); ChannelMessage (expandedString.String(), myNick.String()); } else if ((parms == "-l") || (id == serverName)) // echo locally { BString tempString; tempString << "Uptime: " << expandedString << "\n"; Display (tempString.String(), &whoisColor); } return true; } if (firstWord == "/VERSION" || firstWord == "/TIME") { BString theCmd (firstWord.RemoveFirst ("/")), theNick (GetWord (data, 2)); theCmd.ToUpper(); // the "." check is because the user might specify a server name if (theNick != "-9z99" && theNick.FindFirst(".") < 0) { BString tempString ("/CTCP "); tempString << theNick << " " << theCmd; SlashParser (tempString.String()); } else { BMessage send (M_SERVER_SEND); AddSend (&send, theCmd); if (theNick != "-9z99") { AddSend (&send, " "); AddSend (&send, theNick); } AddSend (&send, endl); } return true; } if (firstWord == "/VISIT") { BString buffer (data); int32 place; if ((place = buffer.FindFirst (" ")) >= 0) { buffer.Remove (0, place + 1); const char *arguments[] = {buffer.String(), 0}; be_roster->Launch ( "text/html", 1, const_cast<char **>(arguments)); } return true; } if (firstWord != "" && firstWord[0] == '/') // != "" is required to prevent a nasty crash with string[0] { BString theCmd (firstWord.RemoveAll ("/")), theRest (RestOfString (data, 2)); BMessage send (M_SERVER_SEND); if (theCmd == "W") theCmd = "WHOIS"; AddSend (&send, theCmd); if (theRest != "-9z99") { AddSend (&send, " "); AddSend (&send, theRest); } AddSend (&send, endl); return true; } return false; // we couldn't handle this message }