Esempio n. 1
0
void* mpThread(void* _args)
{
    char *p = NULL;
    char buf[1024];
    char* args = _args ? strdup(_args) : 0;
    int n;
    int offset;
    void* data;
    for (;;)
    {
        if (data = plGetEntry(&playlist))
        {
            n = mpOpen(data, args);
        }
        else
        {
            if (!loopclip) break;
            n = mpOpen(loopclip, 0);
        }
        free(data);
        if (n) break;

        mpState = MP_PLAYING;
        MutexLock(&mpConsoleMutex);
        while (mpCommand("get_time_pos") <= 0) msleep(500);
        do
        {
            offset = 0;
            while (offset < sizeof(buf) - 1)
            {
                n = mpRead(buf + offset, sizeof(buf) - 1 - offset);
                if (n <= 0) break;
                offset += n;
                buf[offset] = 0;
                if (p = strstr(buf, "ANS_TIME_POSITION="))
                {
                    mpPos = atoi(p + 18);
                    break;
                }
            }
            // stop here when paused
            MutexUnlock(&mpConsoleMutex);
            do
            {
                msleep(500);
            }
            while (mpState == MP_PAUSED);
            MutexLock(&mpConsoleMutex);
        }
        while (mpCommand("get_time_pos") > 0);
        MutexUnlock(&mpConsoleMutex);
        ShellTerminate(&mpx);
        ShellClean(&mpx);
    }
    free(args);
    mpState = MP_IDLE;
    mpThreadHandle = 0;
    return 0;
}
Esempio n. 2
0
int uhMpd(UrlHandlerParam* param)
{
	char *cmd=param->pucRequest;
	if (!strncmp(cmd,"open=",5)) {
		if (mpOpen(cmd+5) || !(mpRead(param->pucBuffer,param->iDataBytes))) {
			strcpy(param->pucBuffer,"Failed to launch MPlayer");
		}
	} else if (!strncmp(cmd,"command=",8)) {
		strcpy(param->pucBuffer,(mpCommand(cmd+8)>0)?"OK":"Error");
	} else {
		return 0;
	}
	param->iDataBytes=strlen(param->pucBuffer);
	param->fileType=HTTPFILETYPE_TEXT;
	return FLAG_DATA_RAW;
}
Esempio n. 3
0
int handleFileFunctionRequest(int acceptHandle, char *inBuffer, char *outBuffer, int type, int msgSize) {
    int32_t ret = -1;
    int32_t index = -1;
    int32_t mode = -1;
    int32_t flags = -1;
    int32_t fd = -1;
    int32_t maxBytes = -1;

    int sendRet = 0;
    int namelen = 0;
    short extensionId = -1;

    switch (type) {

        case FILE_CTRL_OPEN:
            flags = getInt32(inBuffer, 12);
            mode = getInt32(inBuffer, 16);
            ret = mpOpen(inBuffer + 20, flags, mode);
            setInt32(outBuffer, 0, 4);
            setInt32(outBuffer, 4, ret);
            sendRet = sendN(acceptHandle, outBuffer, 8, 0);
            if (sendRet != 8) {
                fprintf(stderr, "tcpSvr: sendRet = %d != 8\n", sendRet);
                return -1;
            }
            break;

        case FILE_CTRL_CREATE:
            flags = getInt32(inBuffer, 12);
            ret = mpCreate(inBuffer + 16, flags);
            setInt32(outBuffer, 0, 4);
            setInt32(outBuffer, 4, ret);
            sendRet = sendN(acceptHandle, outBuffer, 8, 0);
            if (sendRet != 8) {
                fprintf(stderr, "tcpSvr: sendRet = %d != 8\n", sendRet);
                return -1;
            }
            break;

        case FILE_CTRL_CLOSE:
            if (msgSize != 12) {
                fprintf(stderr, "tcpSvr: invalid msgSize for mpClose = %d != 12\n", msgSize);
                return -1;
            }
            fd = getInt32(inBuffer, 12);
            if (fd < 1) {
                fprintf(stderr, "tcpSvr: invalid fd for mpRead = %d\n", fd);
                return -1;
            }
            ret = mpClose(fd);
            setInt32(outBuffer, 0, 4);
            setInt32(outBuffer, 4, ret);
            sendRet = sendN(acceptHandle, outBuffer, 8, 0);
            if (sendRet != 8) {
                fprintf(stderr, "tcpSvr: sendRet = %d != 8\n", sendRet);
                return -1;
            }
            break;

        case FILE_CTRL_READ:
            fd = getInt32(inBuffer, 12);
            if (fd < 1) {
                fprintf(stderr, "tcpSvr: invalid fd for mpRead = %d\n", fd);
                return -1;
            }
            maxBytes = getInt32(inBuffer, 16);
            if (maxBytes < 1 || maxBytes >= (BUFF_MAX - 8)) {
                fprintf(stderr, "tcpSvr: invalid maxBytes for mpRead = %d max = %d\n", maxBytes,(BUFF_MAX-8));
                return -1;
            }
            ret = mpRead(fd, outBuffer + 8, maxBytes);
            setInt32(outBuffer, 0, 4 + (ret > 0 ? ret : 0));
            setInt32(outBuffer, 4, ret);
            sendRet = sendN(acceptHandle, outBuffer, 8 + (ret > 0 ? ret : 0), 0);
            if (sendRet != 8 + (ret > 0 ? ret : 0)) {
                fprintf(stderr, "tcpSvr: sendRet = %d != 8 + (ret > 0?ret:0)\n", sendRet);
                return -1;
            }
            break;


        case FILE_CTRL_WRITE:
            fd = getInt32(inBuffer, 12);
            if (fd < 1) {
                fprintf(stderr, "tcpSvr: invalid fd for mpRead = %d\n", fd);
                return -1;
            }
            maxBytes = getInt32(inBuffer, 16);
            if (maxBytes < 1 || maxBytes >= (BUFF_MAX - 8)) {
                fprintf(stderr, "tcpSvr: invalid maxBytes for mpRead = %d max = %d\n", maxBytes,(BUFF_MAX-8));
                return -1;
            }
            ret = mpWrite(fd, inBuffer+20, maxBytes);
            setInt32(outBuffer, 0, 4 + (ret > 0 ? ret : 0));
            setInt32(outBuffer, 4, ret);
            sendRet = sendN(acceptHandle, outBuffer, 8 + (ret > 0 ? ret : 0), 0);
            if (sendRet != 8 + (ret > 0 ? ret : 0)) {
                fprintf(stderr, "tcpSvr: sendRet = %d != 8 + (ret > 0?ret:0)\n", sendRet);
                return -1;
            }
            break;

        default:
            fprintf(stderr, "tcpSvr: invalid file function type = %d\n", type);
            return -1;
    }
    return 0;
}
Esempio n. 4
0
File: mpd.c Progetto: avih/miniweb
int uhMpd(UrlHandlerParam* param)
{
	char *action;
	char *pbuf = param->pucBuffer;
	int bufsize = param->iDataBytes;
	HTTP_XML_NODE node;

	mwParseQueryString(param);
	action = mwGetVarValue(param->pxVars, "action", 0);

	mwWriteXmlHeader(&pbuf, &bufsize, 10, "gb2312", mwGetVarValue(param->pxVars, "xsl", 0));
	mwWriteXmlString(&pbuf, &bufsize, 0, "<response>");

	node.indent = 1;
	node.name = "state";
	node.fmt = "%s";
	node.flags = 0;

	if (!strcmp(param->pucRequest + 1, "playlist")) {
		PL_ENTRY *ptr;
		int i;
		if (!action) {
		} else if (!strcmp(action, "add")) {
			char *filename = mwGetVarValue(param->pxVars, "stream", 0);
			char *title = mwGetVarValue(param->pxVars, "title", 0);
			if (!title) title = "";
			if (!filename) {
				node.value = "error";
			} else {
				int fnlen;
				int titlelen;
				char *entrydata;
				mwDecodeString(filename);
				fnlen = strlen(filename);
				titlelen = strlen(title);
				entrydata = (char*)malloc(fnlen + titlelen + 3);
				strcpy(entrydata, filename);
				strcpy(entrydata + fnlen + 1, title);
				node.value = plAddEntry(&playlist, entrydata, fnlen + titlelen + 2) ? "OK" : "error";
			}
			mwWriteXmlLine(&pbuf, &bufsize, &node, 0);
		} else if (!strcmp(action, "pin")) {
			int index = mwGetVarValueInt(param->pxVars, "arg", 0);
			node.value = plPinEntryByIndex(&playlist, index) ? "OK" : "error";
			mwWriteXmlLine(&pbuf, &bufsize, &node, 0);
		} else if (!strcmp(action, "del")) {
			int index = mwGetVarValueInt(param->pxVars, "arg", 0);
			node.value = plDelEntryByIndex(&playlist, index) ? "OK" : "error";
			mwWriteXmlLine(&pbuf, &bufsize, &node, 0);
		}
		ptr = playlist;
		mwWriteXmlString(&pbuf, &bufsize, 1, "<playlist>");
		for (i=0; ptr; ptr = ptr->next, i++) {
			char buf[32];
			snprintf(buf, sizeof(buf), "<item index=\"%03d\">", i);
			mwWriteXmlString(&pbuf, &bufsize, 2, buf);

			node.indent = 3;
			node.name = "stream";
			node.fmt = "%s";
			node.value = ptr->data;
			mwWriteXmlLine(&pbuf, &bufsize, &node, 0);

			node.flags = XN_CDATA;
			node.name = "title";
			node.value = (char*)ptr->data + strlen(ptr->data) + 1;
			mwWriteXmlLine(&pbuf, &bufsize, &node, 0);

			mwWriteXmlString(&pbuf, &bufsize, 2, "</item>");
		}
		mwWriteXmlString(&pbuf, &bufsize, 1, "</playlist>");
	} else if (!action) {

	} else if (!strcmp(action, "play")) {
		char *filename = mwGetVarValue(param->pxVars, "stream", 0);
		char *args = mwGetVarValue(param->pxVars, "arg", 0);
		if (filename && *filename) {
			mwDecodeString(filename);
			filename = strdup(filename);
		}
		if ((!filename || !*filename) || plAddEntry(&playlist, filename, strlen(filename) + 1)) {
			if (!mpThreadHandle) {
				if (args) mwDecodeString(args);
				ThreadCreate(&mpThreadHandle, mpThread, args);
			} else {
				mpClose();
			}
			node.value = "OK";
		} else {
			node.value = "error";
		}
		mwWriteXmlLine(&pbuf, &bufsize, &node, 0);
	} else if (!strcmp(action, "query")) {
		int i;
		char* info;
		for (i = 0; info = mwGetVarValue(param->pxVars, "info", i); i++) {
			if (!strcmp(info, "pos")) {
				node.name = "pos";
				node.fmt = "%d";
				node.value = (void*)mpPos;
				mwWriteXmlLine(&pbuf, &bufsize, &node, 0);
			} else if (!strcmp(info, "state")) {
				node.name = "state";
				node.fmt = "%s";
				node.value = states[mpState];
				mwWriteXmlLine(&pbuf, &bufsize, &node, 0);
			}
		}
	} else if (!strcmp(action, "pause")) {
		mpState = (mpState == MP_PLAYING ? MP_PAUSED : MP_PLAYING);
		mpCommand("pause");
	} else if (!strcmp(action, "seek")) {
		char buf[32];
		char *args = mwGetVarValue(param->pxVars, "arg", 0);
		if (args) {
			snprintf(buf, sizeof(buf), "seek %s", args);
			mpCommand(buf);
		}
	} else if (!strcmp(action, "command")) {
		char *cmd = mwGetVarValue(param->pxVars, "arg", 0);
		char *hasResult = mwGetVarValue(param->pxVars, "result", 0);
		if (cmd) {
			if (mpCommand(cmd) > 0) {
				node.value = "OK";
				if (hasResult) {
					int bytes;
					MutexLock(&mpConsoleMutex);

					bytes = snprintf(pbuf, bufsize,  "  <result><![CDATA[");
					pbuf += bytes;
					bufsize -= bytes;

					bytes = mpRead(pbuf, bufsize);
					MutexUnlock(&mpConsoleMutex);
					if (bytes > 0) {
						pbuf += bytes;
						bufsize -= bytes;
					}

					bytes = snprintf(pbuf, bufsize,  "]]></result>");
					pbuf += bytes;
					bufsize -= bytes;
				}
			} else {
				node.value = "error";
			}
			mwWriteXmlLine(&pbuf, &bufsize, &node, 0);

		}
	} else {
		return 0;
	}

	mwWriteXmlString(&pbuf, &bufsize, 0, "</response>");

	param->iDataBytes=(int)(pbuf-param->pucBuffer);
	param->fileType=HTTPFILETYPE_XML;
	return FLAG_DATA_RAW;
}