Exemplo n.º 1
0
bool ParseLockCommand(CSocketIOPtr s, const char *command)
{
	char *cmd,*p;
	char *param;
	bool bRet = true;
	size_t client;

	if(!*command)
		return bRet; // Empty line

	cmd = strdup(command);
	{
		ClientLock lock;
		client = SockToClient[s->getsocket()];
	}
	p=lock_strchr(cmd,' ');
	if(!p)
	{
		s->printf("001 FAIL Syntax error\n");
	}
	else
	{
		if(!*p)
			param = p;
		else
			param = p+1;
		*p='\0';
		if(!strcmp(cmd,"Client"))
			DoClient(s,client,param);
		else if(!strcmp(cmd,"Lock"))
			DoLock(s,client,param);
		else if(!strcmp(cmd,"Unlock"))
			DoUnlock(s,client,param);
		else if(!strcmp(cmd,"Version"))
			DoVersion(s,client,param);
		else if(!strcmp(cmd,"Modified"))
			DoModified(s,client,param);
		else if(!strcmp(cmd,"Monitor"))
			DoMonitor(s,client,param);
		else if(!strcmp(cmd,"Clients"))
			DoClients(s,client,param);
		else if(!strcmp(cmd,"Locks"))
			DoLocks(s,client,param);
		else if(!strcmp(cmd,"Close"))
		{
			DoClose(s,client,param);
			bRet=false;
		}
		else
			s->printf("001 FAIL Unknown command '%s'\n",cmd);
	}
	free(cmd);
	return bRet;
}
//--------------------------------------------------------------------------------
int Parse(CStdioFile& fIn, CFile& fOut, CFile& fOutBkup)
	{
	char temp[4096];
	char temp2[4096];
	char sName[512];
	char* pBuf;
	CTokenMaster* pMaster = NULL;

	sName[0] = 0;
	bool bRv = false;

	for(;;)
		{
		pBuf = temp;
		if(! fIn.ReadString(pBuf, 4096))
			break;
		while(isspace(*pBuf) && *pBuf)
			pBuf++;
		if(! *pBuf)
			continue;
		if(*pBuf == ';')
			continue;
		else
			{
			// remove all non esential characters from the string
			int i = 0;
			for(char* pBuf2 = pBuf; *pBuf2; pBuf2++)
				{
			//	if(isalnum(*pBuf2) || *pBuf2 == ',' || *pBuf2 == '=')
				if(isprint(*pBuf2))
					temp2[i++] = *pBuf2;
				}

			if(i == 0)
				continue;
			temp2[i] = 0;
			pBuf = temp2;
			}

		printf("%s\n", pBuf);
		char* pBreak = strchr(pBuf, '=');
		if(pBreak == NULL)
			{
			printf("syntax error ^^^^^^^ (= missing)\n");
			continue;
			}

		*pBreak = 0;

		if(*pBuf == 0)
			continue;

		LPCTSTR pKeywords[] = {"token", "count", "max", "bits", "name", "serial", "p3",
			"processor", "dongle", "email", "expires", "extra", "backup", "monitor", "parent" };
		enum { IDTOKEN, IDCOUNT, IDMAX, IDBITS, IDNAME, IDSERIAL, IDP3, IDPROCESSOR,
			IDDONGLE, IDEMAIL, IDEXPIRES, IDEXTRA, IDBACKUP, IDMONITOR, IDPARENT, NCOUNT };
		const int nCount = sizeof(pKeywords) / sizeof(LPCTSTR);

		assert(nCount == NCOUNT);

		for(int i = 0; i < nCount; i++)
			{
			if(strcmp(pBuf, pKeywords[i]) == 0)
				break;
			}

		switch(i)
			{
			case IDTOKEN:
				bRv = DoToken(pBreak+1, pMaster);
				break;
			case IDCOUNT:
				bRv = DoCount(pBreak+1, pMaster);
				break;
			case IDMAX:
				bRv = DoMax(pBreak+1, pMaster);
				break;
			case IDBITS:
				bRv = DoBits(pBreak+1, pMaster);
				break;
			case IDNAME:
				bRv = DoName(pBreak+1, pMaster);
				break;
			case IDSERIAL:
			case IDP3:
			case IDPROCESSOR:
				bRv = DoP3Serial(pBreak+1, pMaster);
				break;
			case IDDONGLE:
				bRv = DoDongle(pBreak+1, pMaster);
				break;
			case IDEMAIL:
				bRv = DoEmail(pBreak+1, pMaster);
				break;
			case IDEXPIRES:
				bRv = DoExpires(pBreak+1, pMaster);
				break;
			case IDEXTRA:
				bRv = DoExtra(pBreak+1, pMaster);
				break;
			case IDBACKUP:
				bRv = DoBackup(pBreak+1, pMaster);
				break;
			case IDMONITOR:
				bRv = DoMonitor(pBreak+1, pMaster);
				break;
			case IDPARENT:
				bRv = DoParent(pBreak+1, pMaster);
				break;
			default:
				printf("syntax error ^^^^^^^ (unknown keyword)\n");
				bRv = false;
				continue;
			}
		}

	if(! bRv)
		return -1;

	if(! WriteFile(fOut, fOutBkup))
		return -1;

	return 0;
	}