// ------------------------------------------------------------------------ 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); } }
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; }
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; }
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); } }
// 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); }
// ------------------------------------------------------------------------ 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; }