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