예제 #1
0
// ------------------------------------------------------------------------
void FskAssociativeArrayElementSet(FskAssociativeArray array, const char *name, const void *value, UInt32 valueSize, SInt32 valueType)
{
	FskAssociativeArrayNameList	list;
	SInt32 nameLen = FskStrLen(name) + 1;

	if (kFskStringType == valueType)
		valueSize = FskStrLen((const char *)value) + 1;
	else if (kFskBlobType == valueType)
		;
	else
		valueSize = 0;

	FskAssociativeArrayElementDispose(array, name);

	if (kFskErrNone == FskMemPtrNew(sizeof(FskAssociativeArrayNameListRec) + nameLen + valueSize, &list)) {
		unsigned char *d = list->data;

		list->name = (char *)d;
		FskMemMove(d, name, nameLen);
		d += nameLen;
		list->valueType = valueType;
		list->valueSize = valueSize;
		list->next = NULL;

		if ((kFskStringType == valueType) || (kFskBlobType == valueType)) {
			FskMemMove(d, value, valueSize);
			list->value = (char *)d;
		}
		else
			list->value = (char *)value;

		FskListPrepend((FskList*)(void*)&array->arrayHead, (FskListElement)list);
	}
}
예제 #2
0
FskErr FskFSVolumeNotifierNew(FskVolumeNotifierCallbackProc callback, void *refCon, FskFSVolumeNotifier *volNtfOut) {
	FskErr err;
	FskFSVolumeNotifier volNtf = NULL;

	FskAndroidFilesPrintfDebug("VolumeNotifierNew\n");

	if (NULL == gVolNotifiers) {
		err = FskMutexNew(&gVolNotifiersMutex, "volume notifier");
		BAIL_IF_ERR(err);
	}

	err = FskMemPtrNewClear(sizeof(FskFSVolumeNotifierRecord), (FskMemPtr*)(void*)&volNtf);
	BAIL_IF_ERR(err);

	FskMutexAcquire(gVolNotifiersMutex);

	volNtf->dispatch.dispatch = &gFSDispatch;
	volNtf->dispatch.refcon = NULL;
	volNtf->callback = callback;
	volNtf->refCon = refCon;
	volNtf->callbackThread = FskThreadGetCurrent();
	FskListPrepend(&gVolNotifiers, &volNtf->next);

	FskMutexRelease(gVolNotifiersMutex);

bail:
	*volNtfOut = volNtf;

	return err;
}
예제 #3
0
FskErr KprHTTPClientAddTarget(KprHTTPTarget target)
{
	KprHTTPClient self = gKprHTTPClient;
	KprMessage message = target->message;
	FskErr err = kFskErrNone;
	SInt32 priority = abs(message->priority);
	KprHTTPTarget iterator, after = NULL;
	if (message->priority < 0) { // new requests with equal priority go to the start of that priority
		for (iterator = self->targets; iterator; iterator = FskListGetNext(self->targets, iterator)) {
			if (priority >= abs(iterator->message->priority))
				break;
			else
				after = iterator;
		}
	}
	else { // new requests with equal priority go to the end of that priority
		for (iterator = self->targets; iterator; iterator = FskListGetNext(self->targets, iterator)) {
			if (priority > abs(iterator->message->priority))
				break;
			else
				after = iterator;
		}
	}
	if (after)
		FskListInsertAfter(&self->targets, target, after);
	else
		FskListPrepend(&self->targets, target);
	KprHTTPClientIterate();
//bail:
	return err;
}
예제 #4
0
static void KprMQTTQueueReschedule(KprMQTTQueue self)
{
	KprMQTTMessage message;

	if (self->pause) return;

	message = KprMQTTQueueNextMessageToResend(self);
	if (message) {
		if (self->outbox != message) {
			FskListRemove(&self->outbox, message);
			FskListPrepend(&self->outbox, message);
		}

		FskTimeCallbackSet(self->resendCallback, &message->nextTime, KprMQTTQueueTimeToResendMessage, self);
	} else {
		FskTimeCallbackRemove(self->resendCallback);
	}
}
예제 #5
0
// Insert this timer callback into the owning thread's "timerCallbacks" queue.
void sInsertInTime(KplTimeCallback el)
{
	KplTimeCallback cur, last = NULL;
	Boolean reschedule = false;
	KplTimeRecord now;
	KplThread thread;

	thread = (KplThread)el->owner;

	KplTimeGetNow(&now);
	if (1 == FskTimeCompare((FskTime)&el->trigger, (FskTime)&now))
		el->trigger = now;
	cur = (KplTimeCallback)FskListGetNext(thread->timerCallbacks, NULL);
	el->next = NULL;
	el->marked = false;

	if (cur == NULL) {
		FskListPrepend(&thread->timerCallbacks, el);
		reschedule = true;
		goto done;
	}
	while (cur) {
		if (FskTimeCompare((FskTime)&el->trigger, (FskTime)&cur->trigger) > 0) {
			if (last == NULL) {
				reschedule = true;
			}
			FskListInsertAfter(&thread->timerCallbacks, el, last);
			goto done;
		}

		last = cur;
		cur = cur->next;
	}
	if (!cur && last) {
		FskListAppend(&thread->timerCallbacks, el);
	}
	
done:
	if (reschedule)
		rescheduleTimer(thread);
}
예제 #6
0
// ------------------------------------------------------------------------
int FskHeadersParseChunk(char *blob, int blobSize, UInt16 headerType, FskHeaders *headers)
{
	char	*line = NULL;
	int		lineMax;
	int		copySize, lineSize;
	char 	*blobPtr = blob, *pos;
	int		consumed = 0, leftoverSize = 0;
	char	*name, *value;
	Boolean withComma;
	int		consumedSize = 0;
	
	if (headers->headersParsed)
		return 0;

	if (headers->leftover) {
		leftoverSize = FskStrLen(headers->leftover);
		lineMax = blobSize + leftoverSize + 1;
		if (kFskErrNone != FskMemPtrRealloc(lineMax, &line)) {
			consumedSize = -1;
			goto bail;
		}
		FskStrCopy(line, headers->leftover);	
		FskMemPtrDisposeAt((void**)(void*)&headers->leftover);
	}
	else {
		lineMax = blobSize + 1;
		if (kFskErrNone != FskMemPtrNew(lineMax, &line)) {
			consumedSize = -1;
			goto bail;
		}
		line[0] = '\0';
	}
	
	lineSize = FskStrLen(line);
	while (blobPtr) {
		copySize = blobSize;
		pos = FskStrNChr(blobPtr, copySize, kFskLF);
		if (pos) {
			int i;
			copySize = (pos - blobPtr) + 1;
			for (i=0; i<copySize; i++) {
				if (blobPtr[i] & 0x80) {
					headers->headersParsed = true;
					consumedSize = consumed - leftoverSize;
					if (consumedSize == 0)
						consumedSize = -1;
					goto bail;
				}
				if (':' == blobPtr[i])
					break;			// high ascii allowed after the colon
			}
		}
		FskStrNCopy(&line[lineSize], blobPtr, copySize);
		line[lineSize+copySize] = '\0';

		blobPtr += copySize;
		blobSize -= copySize;
		lineSize = FskStrLen(line);

		if (((2 == lineSize) && (kFskCR == line[0]) && (kFskLF == line[1])) || ((1 == lineSize) && (kFskLF == line[0]))) {		// the LF only case is to handle known bug with yimg.com (Yahoo Image server)
			consumed += lineSize;
			headers->headersParsed = true;
			consumedSize = consumed - leftoverSize;
			goto bail;
		}

		if (!pos) {
			if (lineSize) {
				headers->leftover = FskStrDoCopy(line);
				consumed += lineSize;
			}
			consumedSize = consumed - leftoverSize;
			goto bail;
		}
		consumed += lineSize;

		if (NULL == headers->protocol) {
			if ((-1 == sParseStartLine(line, headerType, headers) || (NULL == headers->protocol))) {
				consumedSize = -1;
				goto bail;
			}
			lineSize = 0;
			line[0] = '\0';
			continue;
		}

		withComma = true;
		if (FskStrIsSpace(*line)) {
			withComma = false;
			name = headers->lastName;
			value = line;
		}
		else {
			name = FskStrStripHeadSpace(line);
			value = FskStrChr(line, ':');
		}
		if (value) {
			*value++ = '\0';
			value = FskStrStripHeadSpace(value);
			FskStrStripTailSpace(value);
		}
		if (NULL == name) {
			consumedSize = -1;
			goto bail;
		}

		FskStrStripTailSpace(name);

		if (headers->flags & kFskHeadersDoNotMergeDuplicates) { // raw headers
			FskAssociativeArrayNameList	list;
			SInt32 nameLen = FskStrLen(name) + 1;
			SInt32 valueType = kFskStringType;
			UInt32 valueSize = FskStrLen(value) + 1;

			if (NULL == value) {
				consumedSize = -1;
				goto bail;
			}

			//bailIfError(FskMemPtrNew(sizeof(FskAssociativeArrayNameListRec) + nameLen + valueSize, &list));
			if (kFskErrNone == FskMemPtrNew(sizeof(FskAssociativeArrayNameListRec) + nameLen + valueSize, &list)) {
				unsigned char *d = list->data;

				// name
				FskMemMove(d, name, nameLen);
				list->name = (char *)d;
				d += nameLen;

				// value
				FskMemMove(d, value, valueSize);
				list->value = (char *)d;
				list->valueSize = valueSize;
				list->valueType = valueType;

				list->next = NULL;
				FskListPrepend(headers->theHeaders, list);
			}
		}
		else
			FskAssociativeArrayElementCatenateString(headers->theHeaders, name, value, withComma);
		if (name != headers->lastName) {
			FskMemPtrDispose(headers->lastName);
			headers->lastName = FskStrDoCopy(name);
		}
		line[0] = '\0';
		lineSize = 0;
	}

	if (lineSize) {
		headers->leftover = FskStrDoCopy(line);
		consumed += lineSize;
	}

	consumedSize = consumed - leftoverSize;

bail:
	if (line)
		FskMemPtrDispose(line);

	return consumedSize;
}