Initial checkin

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@1019 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
François Revol
2002-09-12 21:38:19 +00:00
parent 070e067332
commit 86cd46f680
+394
View File
@@ -0,0 +1,394 @@
#include <Application.h>
#include <Bitmap.h>
#include <Button.h>
#include <Messenger.h>
#include <Mime.h>
#include <OS.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <String.h>
#include <StringView.h>
#include <unistd.h>
#include <View.h>
#include <Window.h>
// LDFLAGS="-lbe" make
//from bdb-ing /bin/shutdown:
#define B_SYSTEM_SHUTDOWN 0x12d
#define B_SYSTEM_REBOOT 0x12e
const char *roster_sig = "application/x-vnd.Be-ROST";
extern "C" void _kshutdown_(long arg);
#define SHUTDOWN_HALT 0
#define SHUTDOWN_REBOOT 1
// globals
const char kIconBits[] = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x00,
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x00,
0x3f, 0x3f, 0x3f, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0x3f, 0x3f,
0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0xff, 0xff,
0xff, 0xff, 0xff, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0x2f,
0xeb, 0x2f, 0x30, 0x2f, 0x00, 0x00, 0x3f, 0x3f, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0xff, 0xff,
0xff, 0xff, 0xff, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x3f, 0x3f, 0x3f, 0x00, 0x2f, 0xeb, 0x2c,
0x2b, 0x2c, 0x2d, 0x30, 0x2f, 0x2f, 0x00, 0x3f, 0x3f, 0x00, 0x3f, 0x3f, 0x3f, 0x00, 0xff, 0xff,
0xff, 0xff, 0xff, 0x00, 0x3f, 0x3f, 0x3f, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x2f, 0x2b, 0x2a,
0x2b, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x00, 0x3f, 0x3f, 0x3f, 0x00, 0x3f, 0x3f, 0x00, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x2f, 0x2b, 0x2b, 0x2a,
0x2b, 0x2b, 0x2b, 0x2d, 0x2d, 0x2f, 0x30, 0x00, 0x3f, 0x3f, 0x3f, 0x00, 0x3f, 0x00, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x2f, 0x2b, 0x2b, 0x3f,
0x2b, 0x2a, 0x2c, 0x2d, 0x2d, 0xeb, 0x30, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x2f, 0x2c, 0x2b, 0x2b,
0x2a, 0x2b, 0x2c, 0x2c, 0x2e, 0x2f, 0x2f, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0xff, 0xff,
0xff, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x2f, 0x2d, 0x2b, 0x2c,
0x2c, 0x2b, 0x2c, 0x2d, 0x2d, 0x2f, 0x30, 0x00, 0x3f, 0x3f, 0x3f, 0x00, 0x3f, 0x00, 0xff, 0xff,
0xff, 0xff, 0xff, 0x00, 0x3f, 0x3f, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x2f, 0xeb, 0x2d, 0x2d,
0x2c, 0x2c, 0x2d, 0x2d, 0xeb, 0x2f, 0x2f, 0x00, 0x3f, 0x3f, 0x3f, 0x00, 0x3f, 0x3f, 0x00, 0xff,
0xff, 0xff, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x30, 0x2e, 0x2c,
0x2d, 0x2d, 0x2d, 0x2f, 0x2f, 0x2f, 0x00, 0x3f, 0x3f, 0x3f, 0x00, 0x3f, 0x3f, 0x3f, 0x00, 0xff,
0xff, 0xff, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x3f, 0x3f, 0x3f, 0x00, 0x2f, 0x2f, 0xeb,
0xeb, 0xeb, 0xeb, 0xeb, 0x2f, 0x2f, 0x00, 0x3f, 0x3f, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0xff,
0xff, 0xff, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0x3f, 0x3f, 0x00, 0x00, 0x2f,
0x2f, 0x30, 0x2f, 0x2f, 0x00, 0x00, 0x3f, 0x3f, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0xff,
0xff, 0xff, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0x3f, 0x3f, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0xff,
0xff, 0xff, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0x3f,
0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0xff,
0xff, 0xff, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00,
0x00, 0x3f, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0xff, 0xff,
0xff, 0xff, 0xff, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0x00,
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
unsigned long time_to_sleep = 0; // -d
int reboot = 0; // -r
class SView : public BView
{
public:
SView(BRect frame);
~SView();
void Draw(BRect updateRect);
void Pulse();
BButton *fButton;
BString *fTitleStr;
BStringView *fTitle;
BBitmap *fIcon;
int32 fWidth;
int32 fHeight;
int32 fLeftMargin;
static const int32 fTopMargin = 8;
unsigned long fTimeLeft;
};
class ShutdownWindow : public BWindow
{
public:
ShutdownWindow(thread_id id);
~ShutdownWindow();
void MessageReceived(BMessage *msg);
bool QuitRequested();
void Quit();
private:
SView *fView;
thread_id fShutdownThread;
};
class ShutdownApp : public BApplication
{
public:
ShutdownApp(thread_id id);
~ShutdownApp();
private:
ShutdownWindow *fWindow;
};
SView::SView(BRect frame)
:BView(frame, "SView", B_FOLLOW_LEFT_RIGHT, B_PULSE_NEEDED | B_WILL_DRAW),
fButton(NULL),
fTitleStr(NULL),
fTitle(NULL),
fIcon(NULL),
fWidth(0),
fHeight(0),
fLeftMargin(B_LARGE_ICON + 8),
fTimeLeft(time_to_sleep)
{
SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
SetLowColor(ViewColor());
SetDrawingMode(B_OP_OVER);
fIcon = new BBitmap(BRect(0, 0, B_LARGE_ICON-1, B_LARGE_ICON-1), B_CMAP8);
fIcon->SetBits(kIconBits, B_LARGE_ICON*B_LARGE_ICON, 0, B_CMAP8);
fTitleStr = new BString;
if (reboot)
*fTitleStr << "Rebooting in " << (int32)fTimeLeft << " seconds !";
else
*fTitleStr << "Shutting down in " << (int32)fTimeLeft << " seconds !";
// fTitle = new BStringView(BRect( fLeftMargin, fTopMargin, fLeftMargin, fTopMargin), "", fTitleStr->String());
fTitle = new BStringView(BRect(55, 10, 260, 35), "", fTitleStr->String());
fButton = new BButton(BRect(159, 42, 259, 66), "quit", "Cancel", new BMessage('_QRQ'));
fButton->MakeDefault(true);
AddChild(fTitle);
AddChild(fButton);
}
SView::~SView()
{
if (fButton != NULL)
delete fButton;
if (fTitle != NULL)
delete fTitle;
if (fIcon != NULL)
delete fIcon;
}
void
SView::Pulse()
{
fTimeLeft--;
fTitleStr->SetTo("");
if (reboot)
*fTitleStr << "Rebooting in " << (int32)fTimeLeft << " seconds !";
else
*fTitleStr << "Shutting down in " << (int32)fTimeLeft << " seconds !";
fTitle->SetText(fTitleStr->String());
Invalidate();
}
void
SView::Draw(BRect updateRect)
{
BRect bounds = Bounds();
// left margin background
SetHighColor(tint_color(ViewColor(), B_HIGHLIGHT_BACKGROUND_TINT));
FillRect(BRect(0, 0, B_LARGE_ICON, bounds.bottom));
// fIcon if any
if(fIcon != NULL)
{
DrawBitmap(fIcon, BPoint( (B_LARGE_ICON / 2), fTopMargin));
}
}
ShutdownWindow::ShutdownWindow(thread_id id)
:BWindow(BRect( 139, 81, 407, 156), "Shutdown", B_TITLED_WINDOW_LOOK,
B_NORMAL_WINDOW_FEEL, B_NOT_RESIZABLE | B_NOT_ZOOMABLE | B_NOT_MINIMIZABLE | B_ASYNCHRONOUS_CONTROLS),
fView(NULL)
{
fShutdownThread = id;
SetPulseRate(1000000);
fView = new SView(Bounds());
AddChild(fView);
}
ShutdownWindow::~ShutdownWindow()
{
fView->LockLooper();
fView->RemoveSelf();
delete fView;
}
void
ShutdownWindow::MessageReceived(BMessage *msg)
{
switch(msg->what)
{
default:
BWindow::MessageReceived(msg);
break;
}
}
bool
ShutdownWindow::QuitRequested()
{
SetPulseRate(0);
kill(fShutdownThread, SIGUSR1);
return true;
}
void
ShutdownWindow::Quit()
{
// quit app on window close
// be_app->PostMessage(B_QUIT_REQUESTED);
// call default Quit()
BWindow::Quit();
}
ShutdownApp::ShutdownApp(thread_id id)
:BApplication("application/x-vnd.ShutDown-app")
{
fWindow = new ShutdownWindow(id);
fWindow->SetWorkspaces(0xFFFFFFFF);
fWindow->Show();
}
ShutdownApp::~ShutdownApp()
{
}
int32 app_thread(void *arg)
{
thread_id tid = (thread_id) arg;
(new ShutdownApp(tid))->Run();
delete be_app;
return B_OK;
}
/***************************/
void handle_usr1(int sig)
{
while (0);
}
int main(int argc, char **argv)
{
int i;
int quick = 0; // -q
int alert = 0; // -a
BMessenger msgr(roster_sig);
for (i = 1; i < argc; i++) {
if (!strcmp(argv[i], "-q"))
quick = 1;
else if (!strcmp(argv[i], "-r"))
reboot = 1;
else if (!strcmp(argv[i], "-c")) {
team_info ti;
thread_info thi;
int32 team_cookie = 0;
int32 thread_cookie = 0;
team_id myteam;
get_thread_info(find_thread(NULL), &thi);
myteam = thi.team;
while (get_next_team_info(&team_cookie, &ti) == B_OK) {
if (strstr(ti.args, "shutdown") != NULL && (ti.team != myteam)) {
thread_cookie = 0;
while (get_next_thread_info(ti.team, &thread_cookie, &thi) == B_OK) {
if (!strcmp(thi.name, "shutdown")) {
kill(thi.thread, SIGUSR1);
}
}
}
}
exit (0);
} else if (!strcmp(argv[i], "-a")) {
alert = 1;
} else if (!strcmp(argv[i], "-d") && (i+1 < argc)) {
i++;
time_to_sleep = strtol(argv[i], &argv[i], 10);
} else {
fprintf(stderr,
"usage: %s [-r] [-q] [-c] [-a] [-d time]
-r reboot,
-q quick shutdown (don't broadcast apps),
-c cancel a running shutdown,
-a alerts user while waiting,
-d delay shutdown by <time> seconds.
", argv[0]);
exit (1);
}
}
if (time_to_sleep > 0) {
unsigned int left;
thread_id BApp_thread;
signal(SIGUSR1, handle_usr1);
if (alert) {
puts("shutting down");
BApp_thread = spawn_thread(app_thread, "BApplication", B_NORMAL_PRIORITY, (void *)find_thread(NULL));
resume_thread(BApp_thread);
}
left = sleep((unsigned int)time_to_sleep);
if (alert) {
status_t err;
be_app->LockLooper();
be_app->PostMessage(B_QUIT_REQUESTED);
be_app->UnlockLooper();
wait_for_thread(BApp_thread, &err);
snooze(100000);
}
if (left > 0) {
fprintf(stderr, "Shutdown cancelled.\n");
exit (0);
}
}
if (quick) {
if (reboot)
_kshutdown_(SHUTDOWN_REBOOT);
else
_kshutdown_(SHUTDOWN_HALT);
fprintf(stderr, "Shutdown failed!\n");
return 2;
} else {
status_t err = 1;
if (reboot)
err = msgr.SendMessage(B_SYSTEM_REBOOT);
else
err = msgr.SendMessage(B_SYSTEM_SHUTDOWN);
if (err != B_OK) {
fprintf(stderr, "Failed to send message to roster server: %s\n", strerror(err));
exit (2);
}
}
return 0;
}