예제 #1
0
 void KprZeroconfDiscoverServerCallback(KprZeroconfBrowser self, KprZeroconfServiceInfo service, Boolean alive)
 {
 #define kKPRZeroconfKinomaDiscoverURL "xkpr://%s/discover"
 #define kKPRZeroconfKinomaDiscoverJSON "{\"id\":\"%s\",\"uuid\":\"%s\",\"url\":\"http://%s:%lu/\",\"protocol\":\"zeroconf\"}"
 #define kKPRZeroconfKinomaForgetURL "xkpr://%s/forget"
 #define kKPRZeroconfKinomaForgetJSON "{\"id\":\"%s\",\"uuid\":\"%s\",\"protocol\":\"zeroconf\"}"
 	FskErr err = kFskErrNone;
 	char id[256];
 	char url[1024];
 	char json[2048];
 	UInt32 size;
 	KprMessage message = NULL;
 	char* authority = NULL;
 	bailIfError(KprZeroconfServiceNewAuthority(service->type, &authority));
	if (alive) {
		snprintf(url, sizeof(url), kKPRZeroconfKinomaDiscoverURL, self->authority);
		snprintf(json, sizeof(json), kKPRZeroconfKinomaDiscoverJSON, authority, service->name, service->ip, service->port);
	}
	else {
		snprintf(url, sizeof(url), kKPRZeroconfKinomaForgetURL, self->authority);
		snprintf(json, sizeof(json), kKPRZeroconfKinomaForgetJSON, authority, service->name);
	}
 	size = FskStrLen(json);
 	bailIfError(KprMessageNew(&message, url));
 	bailIfError(KprMessageSetRequestBody(message, json, size));
 	FskStrNumToStr(size, id, sizeof(id));
 	bailIfError(KprMessageSetRequestHeader(message, kFskStrContentLength, id));
 	bailIfError(KprMessageSetRequestHeader(message, kFskStrContentType, "application/json"));
 	KprMessageInvoke(message, NULL, NULL, NULL);
  	FskMemPtrDispose(authority);
	return;
 bail:
	KprMessageDispose(message);
  	FskMemPtrDispose(authority);
 }
예제 #2
0
static void KPR_Message_invoke_executor(xsMachine* the)
{
	KprMessage message;
	KprPromiseTarget target;
	xsResult = xsGet(xsFunction, xsID_message);
	message = kprGetHostData(xsResult, this, message);
	xsThrowIfFskErr(KprPromiseTargetNew(&target, the, &xsArg(0), &xsArg(1)));
	xsThrowIfFskErr(KprMessageInvoke(message, KprPromiseTargetComplete, KprPromiseTargetDispose, target));
}
예제 #3
0
void KPRLibrarySniffPodcast(xsMachine *the)
{
    KprMessage message;
    KprFunctionTarget target;
    xsThrowIfFskErr(KprMessageNew(&message, xsToString(xsArg(1))));
    xsThrowIfFskErr(KprMessageSetRequestHeader(message, "Range", "bytes=0-4095"));
    xsThrowIfFskErr(KprFunctionTargetNew(&target, the, &xsArg(2)));
    xsThrowIfFskErr(KprMessageInvoke(message, KPRLibrarySniffPodcastComplete, KprFunctionTargetDispose, target));
}
예제 #4
0
FskErr KprLibrarySessionRedirect(KprLibrarySession session)
{
    FskErr err = kFskErrNone;
    KprMessage message;
    bailIfError(KprMessageNew(&message, session->url));
    KprMessageInvoke(message, KprLibrarySessionRedirectCallback, NULL, session->request);
    err = kFskErrNeedMoreTime;
bail:
    return err;
}
예제 #5
0
void KprMessageComplete(KprMessage self)
{
	char* url;
	FskThread thread = KprShellGetThread(gShell);
	if (!thread) return; // @@ happens on exit
	if (thread != FskThreadGetCurrent()) {
		FskThreadPostCallback(thread, (FskThreadCallback)KprMessageComplete, self, NULL, NULL, NULL);
        return;
    }
	FskInstrumentedItemSendMessageDebug(self, kprInstrumentedMessageComplete, self);
	if (FskListRemove(&gShell->messages, self)) {
		self->usage--; // message queue
		self->waiting = false;
		url = KprMessageGetResponseHeader(self, "location");
		if (url && (!FskStrCompareWithLength(self->url, "xkpr", 4)) && ((!self->sniffing) || (!FskStrCompareWithLength(url, "xkpr", 4)))) {
			FskMemPtrDispose(self->url);
			self->url = FskStrDoCopy(url);
			//bailIfNULL(self->url);
			KprURLSplit(self->url, &self->parts);
			FskAssociativeArrayDispose(self->response.headers);
			self->response.headers = NULL;
			FskMemPtrDispose(self->response.body);
			self->response.body = NULL;
			self->response.size = 0;
            if (self->request.target)
                self->usage--; // @@ request
			if (kFskErrNone == KprMessageInvoke(self, self->request.callback, self->request.dispose, self->request.target))
				return;
		}
		if (self->request.target) {
			if (self->request.callback)
				(*self->request.callback)(self, self->request.target);
			if (self->request.dispose)
				(*self->request.dispose)(self->request.target);
			self->request.callback = NULL;
			self->request.dispose = NULL;
			self->request.target = NULL;
			self->usage--; // request
		}
        if (!self->usage)
            KprMessageDispose(self);
	}
}