status_t BnChatSessionManager::onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { status_t result = 0x80000000; _TRACE("ChatSessionManager::onTransact[pid:%d] >>:code 0x%x",GetCallerPID(),code); //data.print(); switch(code) { case ICSM_GetSessionNames: { CHECK_INTERFACE(IChatSessionManager, data, reply); Vector<String16> list = GetSessionNames(); const size_t N = list.size(); reply->writeInt32(N); for (size_t i=0; i<N; i++) { reply->writeString16(list[i]); } result = NO_ERROR; } break; case ICSM_FindSession: { CHECK_INTERFACE(IChatSessionManager, data, reply); String16 name = data.readString16(); BOOL bDontCreate = data.readInt32(); BOOL bAllowAnonymousAccess = data.readInt32(); sp<IChatSession> b = FindSession(name,bDontCreate,bAllowAnonymousAccess); reply->writeStrongBinder(b->asBinder()); result = NO_ERROR; } break; case ICSM_DeleteSession: { CHECK_INTERFACE(IChatSessionManager, data, reply); String16 name = data.readString16(); status_t err = DeleteSession(name); reply->writeInt32(err); result = NO_ERROR; } break; default: result = BBinder::onTransact(code, data, reply, flags); } _TRACE("ChatSessionManager::onTransact[pid:%d] <<:result %d",GetCallerPID(),result); //reply.print(); return result; }
/* * Main program */ int main(int argc, char *argv[]) { char *p; char errormsg[256]; static char environment_name[] = "SESSION_MANAGER"; int success, found_command_line_name, i; Argc = argc; Argv = argv; for (i = 1; i < argc; i++) { if (argv[i][0] == '-') { switch (argv[i][1]) { case 'd': /* -display */ if (++i >= argc) goto usage; cmd_line_display = (char *) XtNewString (argv[i]); continue; case 's': /* -session */ if (++i >= argc) goto usage; session_name = XtNewString (argv[i]); continue; case 'v': /* -verbose */ verbose = 1; continue; } } usage: fprintf (stderr, "usage: xsm [-display display] [-session session_name] [-verbose]\n"); exit (1); } topLevel = XtVaAppInitialize (&appContext, "XSm", NULL, 0, &argc, argv, NULL, XtNmappedWhenManaged, False, XtNwindowRole, "xsm main window", NULL); wmStateAtom = XInternAtom ( XtDisplay (topLevel), "WM_STATE", False); wmDeleteAtom = XInternAtom ( XtDisplay (topLevel), "WM_DELETE_WINDOW", False); register_signals (appContext); /* * Install an IO error handler. For an explanation, * see the comments for InstallIOErrorHandler(). */ InstallIOErrorHandler (); /* * Init SM lib */ if (!SmsInitialize ("SAMPLE-SM", "1.0", NewClientProc, NULL, HostBasedAuthProc, 256, errormsg)) { fprintf (stderr, "%s\n", errormsg); exit (1); } if (!IceListenForConnections (&numTransports, &listenObjs, 256, errormsg)) { fprintf (stderr, "%s\n", errormsg); exit (1); } atexit(CloseListeners); if (!SetAuthentication (numTransports, listenObjs, &authDataEntries)) { fprintf (stderr, "Could not set authorization\n"); exit (1); } InitWatchProcs (appContext); for (i = 0; i < numTransports; i++) { XtAppAddInput (appContext, IceGetListenConnectionNumber (listenObjs[i]), (XtPointer) XtInputReadMask, NewConnectionXtProc, (XtPointer) listenObjs[i]); } /* the sizeof includes the \0, so we don't need to count the '=' */ networkIds = IceComposeNetworkIdList (numTransports, listenObjs); p = (char *) XtMalloc((sizeof environment_name) + strlen(networkIds) + 1); if(!p) nomem(); sprintf(p, "%s=%s", environment_name, networkIds); putenv(p); if (cmd_line_display) { /* * If a display was passed on the command line, set the DISPLAY * environment in this process so all applications started by * the session manager will run on the specified display. */ p = (char *) XtMalloc(8 + strlen(cmd_line_display) + 1); sprintf(p, "DISPLAY=%s", cmd_line_display); putenv(p); } if (verbose) printf ("setenv %s %s\n", environment_name, networkIds); create_choose_session_popup (); create_main_window (); create_client_info_popup (); create_save_popup (); create_log_popup (); /* * Initalize all lists */ RunningList = ListInit(); if(!RunningList) nomem(); PendingList = ListInit(); if(!PendingList) nomem(); RestartAnywayList = ListInit(); if(!RestartAnywayList) nomem(); RestartImmedList = ListInit(); if(!RestartImmedList) nomem(); WaitForSaveDoneList = ListInit(); if (!WaitForSaveDoneList) nomem(); InitialSaveList = ListInit(); if (!InitialSaveList) nomem(); FailedSaveList = ListInit(); if (!FailedSaveList) nomem(); WaitForInteractList = ListInit(); if (!WaitForInteractList) nomem(); WaitForPhase2List = ListInit(); if (!WaitForPhase2List) nomem(); /* * Get list of session names. If a session name was found on the * command line, and it is in the list of session names we got, then * use that session name. If there were no session names found, then * use the default session name. Otherwise, present a list of session * names for the user to choose from. */ success = GetSessionNames (&sessionNameCount, &sessionNamesShort, &sessionNamesLong, &sessionsLocked); found_command_line_name = 0; if (success && session_name) { for (i = 0; i < sessionNameCount; i++) if (strcmp (session_name, sessionNamesShort[i]) == 0) { found_command_line_name = 1; if (sessionsLocked[i]) { fprintf (stderr, "Session '%s' is locked\n", session_name); exit (1); } break; } } if (!success || found_command_line_name) { FreeSessionNames (sessionNameCount, sessionNamesShort, sessionNamesLong, sessionsLocked); if (!found_command_line_name) session_name = XtNewString (DEFAULT_SESSION_NAME); if (!StartSession (session_name, !found_command_line_name)) UnableToLockSession (session_name); } else { ChooseSession (); } /* * Main loop */ XtAppMainLoop (appContext); exit(0); }