Beispiel #1
0
void ztxt::home()
{
  unsuspend();
  if (bInit)
    inflateEnd(&zstream);

  bInit = true;
  size_t reclen = recordlength(1);
  gotorecordnumber(1);
  fread(compressedtextbuffer, reclen, sizeof(char), fin);

  zstream.next_in = compressedtextbuffer;
  zstream.next_out = expandedtextbuffer;
  zstream.avail_out = buffersize;
  zstream.avail_in = reclen;

  zstream.zalloc = Z_NULL;
  zstream.zfree = Z_NULL;
  zstream.opaque = Z_NULL;

//  printf("Initialising\n");

  inflateInit(&zstream);

  int ret = inflate(&zstream, Z_SYNC_FLUSH);
//  printf("Inflate : %d\n", ret);
  bufferpos = 0;
  bufferrec = 1;
  currentpos = 0;
  buffercontent = buffersize - zstream.avail_out;
//	printf("buffercontent:%u\n", buffercontent);
}
Beispiel #2
0
CList<Bkmk>* ztxt::getbkmklist()
{
  UInt16 recno = ntohs(hdr0.bookmarkRecord);

//  printf("Bookmarks - record %d contains %d\n", recno, ntohs(hdr0.numBookmarks));

  if (recno == 0)
    return 0;

  unsuspend();
  long cur = ftell(fin);
  if (cur == -1)
    return 0;

  CList<Bkmk>* t = new CList<Bkmk>;
  gotorecordnumber(recno);
  for (int i = 0; i < ntohs(hdr0.numBookmarks); i++)
  {
      zTXTbkmk bkmk;
      if (fread(&bkmk, sizeof(bkmk), 1, fin) != 1) break;
//      printf("Bookmark number:%d:%.20s\n", i, bkmk.title);
      tchar title[MAX_BMRK_LENGTH];
      for (int j = 0; j < MAX_BMRK_LENGTH; j++)
	{
	  title[j] = bkmk.title[j];
	}
      t->push_back(Bkmk(title, NULL, ntohl(bkmk.offset)));
  }
  fseek(fin, cur, SEEK_SET);
  return t;
}
Beispiel #3
0
/// Resume the task if it was previously running; otherwise start it.
///
/// \post #task_state is set correctly.
///
/// \param[in] first_time Set this to true if the app
///                       will be started for the first time.
/// \return 0 on success, nonzero otherwise.
int ACTIVE_TASK::resume_or_start(bool first_time) {
    const char* str = "??";
    int retval;

    switch (task_state()) {
    case PROCESS_UNINITIALIZED:
        if (first_time) {
            retval = start();
            str = "Starting";
        } else {
            retval = start();
            str = "Restarting";
        }
        if (task_state() == PROCESS_UNINITIALIZED) {
            // Starting failed because of missing files. Don't treat this
            // as an error because this would terminate the result. Just
            // return here to suppress the start-message.
            return 0;
        }
        if ((retval == ERR_SHMGET) || (retval == ERR_SHMAT)) {
            return retval;
        }
        if (retval) {
            set_task_state(PROCESS_COULDNT_START, "resume_or_start1");
            return retval;
        }
        break;
    case PROCESS_SUSPENDED:
        retval = unsuspend();
        if (retval) {
            msg_printf(wup->project, MSG_INTERNAL_ERROR,
                "Couldn't resume task %s", result->name
            );
            set_task_state(PROCESS_COULDNT_START, "resume_or_start2");
            return retval;
        }
        str = "Resuming";
        break;
    default:
        msg_printf(result->project, MSG_INTERNAL_ERROR,
            "Unexpected state %d for task %s", task_state(), result->name
        );
        return 0;
    }
    if (log_flags.task) {
        msg_printf(result->project, MSG_INFO,
            "%s task %s using %s version %d",
            str,
            result->name,
            app_version->app->name,
            app_version->version_num
        );
    }
    return 0;
}
Beispiel #4
0
static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) {
    struct userdata *u = PA_SINK(o)->userdata;

    switch (code) {

        case PA_SINK_MESSAGE_GET_LATENCY:
            *((pa_usec_t*) data) = sink_get_latency(u, &PA_SINK(o)->sample_spec);
            return 0;

        case PA_SINK_MESSAGE_SET_STATE:

            switch ((pa_sink_state_t) PA_PTR_TO_UINT(data)) {

                case PA_SINK_SUSPENDED:

                    pa_assert(PA_SINK_IS_OPENED(u->sink->thread_info.state));

                    pa_smoother_pause(u->smoother, pa_rtclock_now());

                    if (!u->source || u->source_suspended) {
                        if (suspend(u) < 0)
                            return -1;
                    }
                    u->sink_suspended = true;
                    break;

                case PA_SINK_IDLE:
                case PA_SINK_RUNNING:

                    if (u->sink->thread_info.state == PA_SINK_SUSPENDED) {
                        pa_smoother_resume(u->smoother, pa_rtclock_now(), true);

                        if (!u->source || u->source_suspended) {
                            if (unsuspend(u) < 0)
                                return -1;
                            u->sink->get_volume(u->sink);
                            u->sink->get_mute(u->sink);
                        }
                        u->sink_suspended = false;
                    }
                    break;

                case PA_SINK_INVALID_STATE:
                case PA_SINK_UNLINKED:
                case PA_SINK_INIT:
                    ;
            }

            break;
    }

    return pa_sink_process_msg(o, code, data, offset, chunk);
}
Beispiel #5
0
void CReb::locate(unsigned int n)
{
  UInt32 jl = 0,jh = nopages-1,jm = (jl+jh)/2;
  while (jh > jl+1)
    {
      if (m_pagedetails[jm].pagestart > n)
	{
	  jh = jm;
	}
      else
	{
	  jl = jm;
	}
      jm = (jl+jh)/2;
    }

  unsuspend();
  Page_detail rs = m_pagedetails[jl];
  UInt32 val = n - rs.pagestart;
  if (jl != currentpage.pageno()) readindex(jl);
  currentpage.setoffset(page2pos(jl), jl, ((rs.flags & 8) != 0), rs.len, val);
  if (noparas > 0)
    {
      UInt32 jl = 0,jh = noparas-1,jm = (jl+jh)/2;
      while (jh > jl+1)
	{
	  if (paras[jm].pos > val)
	    {
	      jh = jm;
	    }
	  else
	    {
	      jl = jm;
	    }
	  jm = (jl+jh)/2;
	}

      qDebug("TAGS:%s", (const char*)tags[paras[jl].tag]);
      tagstring = tags[paras[jl].tag]+"<br>"; // Add br to set extra space to 0
      tagoffset = 0;
    }
  unsigned long current = locate();
  if (m_currentstart > current || current > m_currentend)
    {
      start2endSection();
    }
  if (current != n) qDebug("ERROR:Ended up at %u", current);
}
Beispiel #6
0
void ztxt::locate(unsigned int n)
{

    if (hasrandomaccess())
    {
	unsuspend();
	bufferrec = n / ntohs(hdr0.recordSize) + 1;
	if (bufferrec == 1)
	{
	    inflateEnd(&zstream);
	}
	size_t reclen = recordlength(bufferrec);
	if (reclen == 0) return;
	gotorecordnumber(bufferrec);
	fread(compressedtextbuffer, reclen, sizeof(char), fin);

	zstream.next_in = compressedtextbuffer;
	zstream.next_out = expandedtextbuffer;
	zstream.avail_out = buffersize;
	zstream.avail_in = reclen;

	if (bufferrec == 1)
	{
	    zstream.zalloc = Z_NULL;
	    zstream.zfree = Z_NULL;
	    zstream.opaque = Z_NULL;

	    inflateInit(&zstream);
	}


	int ret = inflate(&zstream, Z_SYNC_FLUSH);
	buffercontent = buffersize - zstream.avail_out;
	bufferpos = 0;
	currentpos = n - n % ntohs(hdr0.recordSize);
	while (currentpos < n) getch();
    }
    else
    {
	home();
	while (currentpos < n && getch() != EOF);
    }
}
Beispiel #7
0
QImage* CReb::getPicture(const QString& ref)
{
  QMap<QString, UInt32>::Iterator iter = m_index.find(ref);
  if (iter != m_index.end())
    {
      unsuspend();
      Page_detail rs = m_pagedetails[iter.data()];
      char* imgbuffer = new char[rs.len];
      fseek(fin, page2pos(iter.data()), SEEK_SET);
      fread(imgbuffer, rs.len, 1, fin);
      QByteArray arr;
      arr.assign((const char*)imgbuffer, rs.len);
      QImage* qimage = new QImage(arr);
      return qimage;
    }
  else
    {
      return NULL;
    }
}
Beispiel #8
0
//********************************************
// function name: ExeCmd
// Description: interperts and executes built-in commands
// Parameters: pointer to jobs, command string
// Returns: 0 - success,1 - failure
//**************************************************************************************
int ExeCmd(pJob* head, char* lineSize, char* cmdString)
{
	char* cmd; 
	char* args[MAX_ARG];
	char pwd[MAX_LINE_SIZE];
	static char last_dir[MAX_LINE_SIZE];
	char* delimiters = " \t\n";  
	int i = 0;
	/*========used in kill command=======*/
	int signal_number, Job_number, signal_sent;
	int found_job_pid;
	char found_job_name[MAX_LINE_SIZE];
	/*===================================*/
	/*========used in fg command=========*/
	int child_done_id, fg_runner_pid, fg_req_JID;
	/*===================================*/
	/*========used in bg command=========*/
	int bg_runner_pid;
	/*===================================*/

	bool illegal_cmd = FALSE; // illegal command
    	cmd = strtok(lineSize, delimiters);
	if (cmd == NULL)
		return 0; 
   	args[0] = cmd;
   	L_Fg_Cmd = cmd;
	for (i=1; i<MAX_ARG; i++)
	{
		args[i] = strtok(NULL, delimiters);
	}
/*************************************************/
// Built in Commands
/*************************************************/
	if (!strcmp(cmd, "cd") ) 
	{
		getcwd(pwd,sizeof(pwd));
		if(!strcmp(args[1], "-"))
		{
			if(last_dir[0]!=0)
			{
				chdir(last_dir);
			}
			else
			{
				perror("smash error: > no previous path exists\n");
			}
		}
		else
		{

			if(!chdir(args[1]))
			{
				strcpy(last_dir,pwd);
			}
			else
			{
				printf("smash error: > \"%s\" -path not found\n",args[1]);
				illegal_cmd = TRUE;
			}
		}
	} 
	
	/*************************************************/
	else if (!strcmp(cmd, "pwd")) 
	{
		if(getcwd(pwd,sizeof(pwd))!= NULL)
		{
			fprintf(stdout,"%s\n",pwd);
		}
		else
		{
			perror("smash error: > pwd error\n");
		}
	}
	/*************************************************/
	else if (!strcmp(cmd, "mkdir"))
	{

		if(mkdir(args[1], 0755))
			{
				if(EEXIST == errno)
				{
					printf("smash error: > \"%s\" -directory already exists\n",args[1]);
				}
				else
				{
					printf("smash error: > \"%s\" -cannot create directory\n",args[1]);
				}
			}
	}
	/*************************************************/
	else if (!strcmp(cmd, "jobs")) 
	{
		print_jobs(*head);
	}
	/*************************************************/
	else if (!strcmp(cmd, "kill"))
	{
		if(args[1][0] != '-')
		{
			printf("smash error: > \"%s\"",cmdString);
			return -1;
		}
		signal_number=atoi(args[1]+1);
		Job_number=atoi(args[2]);

		//search requested job
		found_job_pid=find_job_PID(*head,Job_number);

		if(found_job_pid==-1)
		{
			printf("smash error: > kill %d - job does not exist\n",Job_number);
			return -1;
		}
		else
		{

			switch (signal_number)
			{
				case SIGTSTP:
							signal_sent=kill(found_job_pid,SIGTSTP);

							printf("signal SIGTSTP was sent to pid %d\n",found_job_pid);
							if(signal_sent!=0)
							{
								printf("smash error: > kill %d - cannot send signal\n",Job_number);
							}
							strcpy(found_job_name,find_job_name(*head,found_job_pid));
							remove_job(head,found_job_pid);
							insert_job(head, found_job_pid, found_job_name, SUSPENDED);
							break;
				case SIGINT:
							signal_sent=kill(found_job_pid,SIGINT);

							printf("signal SIGINT was sent to pid %d\n",found_job_pid);
							if(signal_sent!=0)
							{
								printf("smash error: > kill %d - cannot send signal\n",Job_number);
							}
							remove_job(head,found_job_pid);
							break;
				case SIGTERM:
							signal_sent=kill(found_job_pid,SIGTERM);

							printf("signal SIGTERM was sent to pid %d\n",found_job_pid);
							if(signal_sent!=0)
							{
								printf("smash error: > kill %d - cannot send signal\n",Job_number);
							}
							remove_job(head,found_job_pid);
							break;
				default:
							signal_sent=kill(found_job_pid,signal_number);
							if(signal_sent!=0)
							{
								printf("smash error: > kill %d - cannot send signal\n",Job_number);
							}
							printf("signal %d was sent to pid %d\n",signal_number,found_job_pid);
			}
		}
	}
	/*************************************************/
	else if (!strcmp(cmd, "showpid")) 
	{
		printf("smash pid is %d\n",getpid());
	}
	/*************************************************/
	else if (!strcmp(cmd, "fg")) 
	{
		if(args[1]==NULL)
		{
			Last_Bg_Pid=get_last_job_pid(*head);
			fg_runner_pid=Last_Bg_Pid;
		}
		else
		{
			fg_req_JID=atoi(args[1]);
			fg_runner_pid=find_job_PID(*head,fg_req_JID);
		}
		if (fg_runner_pid== -1)// No jobs in the Bg
		{
				perror("smash error: requested process not found\n");
		}
		else if(is_suspended(*head,fg_runner_pid)== SUSPENDED)
		{
			kill(fg_runner_pid,SIGCONT);
			printf("signal SIGCONT was sent to pid %d\n",fg_runner_pid);
			unsuspend(*head,fg_runner_pid);
			Susp_Bg_Pid=get_last_suspended_job_pid(*head);
		}
		GPid=fg_runner_pid;
		L_Fg_Cmd = find_job_name(*head,fg_runner_pid);
		do
		{
			child_done_id = wait(NULL);
			if((child_done_id==-1)&&(errno==EINTR)) //child is gone due to inerrupt
			{
				break;
			}
		}
		while((child_done_id != fg_runner_pid) && (fg_runner_pid != Susp_Bg_Pid));
		remove_job(head,fg_runner_pid);
		GPid= -1;

	} 
	/*************************************************/
	else if (!strcmp(cmd, "bg")) 
	{

		if(args[1]==NULL)
			{
				bg_runner_pid=get_last_suspended_job_pid(*head);
			}
		else
			{
				fg_req_JID=atoi(args[1]);
				bg_runner_pid=find_job_PID(*head, fg_req_JID);
				if(is_suspended(*head,bg_runner_pid)==NOT_SUSPENDED)
				{
					perror("smash error: > bg called on un-suspended job\n");
					return -1;
				}
			}
		strcpy(found_job_name,find_job_name(*head,bg_runner_pid));
		printf("%s",found_job_name);
		kill(bg_runner_pid,SIGCONT);
		printf("signal SIGCONT was sent to pid %d\n",bg_runner_pid);
		unsuspend(*head,bg_runner_pid);
		Susp_Bg_Pid=get_last_suspended_job_pid(*head);
	}
	/*************************************************/
	else if (!strcmp(cmd, "quit"))
	{
		if(args[1]==NULL)
		{
			destroy_list(head);
	   		exit(0);
		}
		else if (!strcmp(args[1], "kill"))
		{
			if (kill_jobs(*head) != -1) {
				destroy_list(head);
				exit(0);
			}
			else {
				exit (-1);
			}
		}
		else
			perror("smash error: > quit called with illegal argument\n");
			return -1;
	} 
	/*************************************************/
	else // external command
	{
 		ExeExternal(args, cmdString);
	 	return 0;
	}
	if (illegal_cmd == TRUE)
	{
		printf("smash error: > \"%s\"\n", cmdString);
		return 1;
	}
    return 0;
}
Beispiel #9
0
static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) {
    struct userdata *u = PA_SOURCE(o)->userdata;
    int ret;
    int do_trigger = FALSE, quick = TRUE;

    switch (code) {

        case PA_SOURCE_MESSAGE_GET_LATENCY: {
            pa_usec_t r = 0;

            if (u->fd >= 0) {
                if (u->use_mmap)
                    r = mmap_source_get_latency(u);
                else
                    r = io_source_get_latency(u);
            }

            *((pa_usec_t*) data) = r;
            return 0;
        }

        case PA_SOURCE_MESSAGE_SET_STATE:

            switch ((pa_source_state_t) PA_PTR_TO_UINT(data)) {
                case PA_SOURCE_SUSPENDED:
                    pa_assert(PA_SOURCE_IS_OPENED(u->source->thread_info.state));

                    if (!u->sink || u->sink_suspended) {
                        if (suspend(u) < 0)
                            return -1;
                    }

                    do_trigger = TRUE;

                    u->source_suspended = TRUE;
                    break;

                case PA_SOURCE_IDLE:
                case PA_SOURCE_RUNNING:

                    if (u->source->thread_info.state == PA_SOURCE_INIT) {
                        do_trigger = TRUE;
                        quick = u->sink && PA_SINK_IS_OPENED(u->sink->thread_info.state);
                    }

                    if (u->source->thread_info.state == PA_SOURCE_SUSPENDED) {

                        if (!u->sink || u->sink_suspended) {
                            if (unsuspend(u) < 0)
                                return -1;
                            quick = FALSE;
                        }

                        do_trigger = TRUE;

                        u->in_mmap_current = 0;
                        u->in_mmap_saved_nfrags = 0;

                        u->source_suspended = FALSE;
                    }
                    break;

                case PA_SOURCE_UNLINKED:
                case PA_SOURCE_INIT:
                case PA_SOURCE_INVALID_STATE:
                    ;

            }
            break;

    }

    ret = pa_source_process_msg(o, code, data, offset, chunk);

    if (ret >= 0 && do_trigger) {
        if (trigger(u, quick) < 0)
            return -1;
    }

    return ret;
}
Beispiel #10
0
/* Called from the IO thread. */
static int source_set_state_in_io_thread_cb(pa_source *s, pa_source_state_t new_state, pa_suspend_cause_t new_suspend_cause) {
    struct userdata *u;
    bool do_trigger = false;
    bool quick = true;

    pa_assert(s);
    pa_assert_se(u = s->userdata);

    /* It may be that only the suspend cause is changing, in which case there's
     * nothing to do. */
    if (new_state == s->thread_info.state)
        return 0;

    switch (new_state) {

        case PA_SOURCE_SUSPENDED:
            pa_assert(PA_SOURCE_IS_OPENED(s->thread_info.state));

            if (!u->sink || u->sink_suspended)
                suspend(u);

            do_trigger = true;

            u->source_suspended = true;
            break;

        case PA_SOURCE_IDLE:
        case PA_SOURCE_RUNNING:

            if (s->thread_info.state == PA_SOURCE_INIT) {
                do_trigger = true;
                quick = u->sink && PA_SINK_IS_OPENED(u->sink->thread_info.state);
            }

            if (s->thread_info.state == PA_SOURCE_SUSPENDED) {

                if (!u->sink || u->sink_suspended) {
                    if (unsuspend(u) < 0)
                        return -1;
                    quick = false;
                }

                do_trigger = true;

                u->in_mmap_current = 0;
                u->in_mmap_saved_nfrags = 0;

                u->source_suspended = false;
            }
            break;

        case PA_SOURCE_UNLINKED:
        case PA_SOURCE_INIT:
        case PA_SOURCE_INVALID_STATE:
            ;
    }

    if (do_trigger)
        trigger(u, u->sink ? u->sink->thread_info.state : PA_SINK_INVALID_STATE, new_state, quick);

    return 0;
}