⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vcard.c

📁 通讯录文件vcard解析源码
💻 C
📖 第 1 页 / 共 2 页
字号:
			}
			else if(mystrcmp(ptr,UtfEncodePrin,decLen[1])==0)
			{
				ptr += decLen[1];
				pos = GetSubString(ptr,"\r\n",0);
				if(pos)
				{
					pos = UtfPrin2Gb(ptr,viewBuf+viewLen,pos);
					viewLen += pos;
				}
			}
		}
	}


	pos = GetSubString(dataBuf,"X-SKYPE-CITY",1);//城市
	if(pos >= 0)
	{
		char *ptr = dataBuf+pos;
		if(*ptr == ':')
		{
			ptr += 1;
			pos = GetSubString(ptr,"\r\n",0);
			if(pos >= 0)
			{
				memcpy(viewBuf+viewLen,ptr,pos);
				viewLen += pos;
			}
		}
		else if(*ptr == ';')
		{
			ptr += 1;
			if(mystrcmp(ptr,UtfEncode8Bit,decLen[0]) == 0)
			{
				ptr += decLen[0];
				pos = GetSubString(ptr,"\r\n",0);
				if(pos)
				{
					pos = Utf8Bit2Gb(ptr,viewBuf+viewLen,pos);
					viewLen += pos;
				}
			}
			else if(mystrcmp(ptr,UtfEncodePrin,decLen[1])==0)
			{
				ptr += decLen[1];
				pos = GetSubString(ptr,"\r\n",0);
				if(pos)
				{
					pos = UtfPrin2Gb(ptr,viewBuf+viewLen,pos);
					viewLen += pos;
				}
			}
		}
	}
	

	if(viewLen > bufLen)
	{
		viewTitle[totalLine] = CardViewTitle[CADDR];
		viewPos[totalLine ++] = viewLen;
	}
}

static void GetTel_Skype(U8 *dataBuf)
{
	INT pos,i;
	for(i = 0; i < 4; i ++)
	{
		pos = GetSubString(dataBuf,CardDataTitle[1][CWORKTEL+i],1);
		if(pos >= 0)
			GetNewLineData_Skype(dataBuf+pos,CWORKTEL+i);
	}
}


static void GetEmail_Skype(U8 * dataBuf)
{
	INT pos = GetSubString(dataBuf,CardDataTitle[1][CEMAIL],1);
	if(pos >= 0)
		GetNewLineData_Skype(dataBuf+pos,CEMAIL);
}

static void GetUrl_Skype(U8 * dataBuf)
{
	INT pos = GetSubString(dataBuf,CardDataTitle[1][CURL],1);
	if(pos >= 0)
		GetNewLineData_Skype(dataBuf+pos,CEMAIL);
}

INT InitCardData_Skype(U8 *dataBuf)
{
	INT pos,len;
	U8 *ptr;

	viewLen = totalLine= 0;
	viewPos[totalLine++] = viewLen;
	GetName_Skype(dataBuf);
	GetBirthDay_Skype(dataBuf);
	GetSex_Skype(dataBuf);
	GetLanguage_Skype(dataBuf);
	GetAddr_Skype(dataBuf);
	GetTel_Skype(dataBuf);
	GetEmail_Skype(dataBuf);
	GetUrl_Skype(dataBuf);

	return totalLine - 1;
}

INT InitCardData(U8 *dataBuf)
{

	if(GetSubString(dataBuf,"VERSION:2.1",1) ==-1)
		cardVersion = SKYPE;
	else
		cardVersion = OUTLOOK;
	if(cardVersion == SKYPE)
	{
		totalLine = InitCardData_Skype(dataBuf);
	}
	else
	{
		totalLine = InitCardData_outlook(dataBuf);
	}
	return totalLine;
}

NU_TIMER 	cardTimer;
U8 scrollFlag;
INT dispLen,maxLen,dispX,dispY,scrollOffset;
//maxLen,可以显示的最大长度,dispLen,字符串长度 

void ScrollCardLine(U8 flag)
{
	INT len,titleLen;
	U8 dispBuf[MAX_CHAR+1];
	dispLen = viewPos[dispLine+1] - viewPos[dispLine];
	if(dispLen > 256)
		dispLen = 256;
	titleLen = strlen(viewTitle[dispLine+1]);
	maxLen = MAX_CHAR - titleLen;
	memcpy(lineBuf,viewBuf+viewPos[dispLine],dispLen);
	lineBuf[dispLen ++] = 0x20;
	lineBuf[dispLen ++] = 0x20;
	lineBuf[dispLen] = 0;
	if(dispLine >= 1)
		dispX = 2 + titleLen*12;
	else
	{
		len = viewPos[1] - viewPos[0];
		if(len >= MAX_CHAR)
		{
			dispX = 2;
		}
		else
		{
			len *= 12;
			len = (LCD_X_SIZE-4-len)/2 + 2;
			dispX = 2 +len;
		}
	}
	dispY = viewLinePos[dispLine+1-startLine];
	scrollOffset = 0;
	
	scrollFlag = flag;
	if(flag == FALSE)
	{
		len = CutViewBuf(lineBuf,maxLen);
		memcpy(dispBuf,lineBuf,len);
		for(len;len < maxLen;len ++)
			dispBuf[len] = 0x20;
		if(dispLine == 0)
			Printf(dispX,dispY,lineBuf,GRAY_SEVEN,TITLECOLOR);
		else
			Printf(dispX,dispY,dispBuf,GRAY_SEVEN,BLACK);
	}
}


void CardScrollLineEntry(void)
{
	U8 dispBuf[MAX_CHAR+1],*ptr;
	INT len;
	if(scrollFlag == FALSE)
		return;
	if(dispLen <= maxLen)
	{
		scrollFlag = FALSE;
		Printf(dispX,dispY,lineBuf,GRAY_SEVEN,DISPCOLOR);
		return;
	}

	if(lineBuf[scrollOffset] &0x80)
		scrollOffset += 2;
	else
		scrollOffset += 1;

	if(scrollOffset >= dispLen)
		scrollOffset = 0;

	len = dispLen - scrollOffset;
	if(len >= maxLen)
	{
		memcpy(dispBuf,lineBuf+scrollOffset,maxLen);
	}
	else
	{
		memcpy(dispBuf,lineBuf+scrollOffset,len);
		memcpy(dispBuf+len,lineBuf,maxLen-len);
	}
	len = CutViewBuf(dispBuf,maxLen);
	for(len;len < maxLen; len ++)
		dispBuf[len] = 0x20;
	dispBuf[len] = 0;
	Printf(dispX,dispY,dispBuf,GRAY_SEVEN,DISPCOLOR);

}


INT CardView(U8 * curDir, U8 * curFile)
{
	U8 *scrBuf = SaveScreen(0,LCD_Y_SIZE-1);
	U8 fname[260] = {0};
	INT status;
	INT posList[MAX_TITLE]={0};
	U8  *titleList[MAX_TITLE];
	INT titleLen,dispLen;
	INT len,i,disp = 1;
	INT totalCard,cardInx = 0;
	U8 *ptr;
	SKEY key;

	lineBuf = fname;
	viewTitle = titleList;
	viewPos = posList;

	
	strcpy(fname,curDir);
	len = strlen(fname);
	memcpy(fname+len,"\\",2);
	strcat(fname,curFile);


	if(InitUtf8() == FALSE)
	{
		RestoreScreen(0,LCD_Y_SIZE,scrBuf);
		return FALSE;
	}


	if(InitDiskData(fname) == FALSE)
	{
		RestoreScreen(0,LCD_Y_SIZE-1,scrBuf);
		DestroyUtf8();
		return FALSE;
	}

	status = NU_Allocate_Memory(&System_Memory,&viewBuf,DiskDataSize+1,NU_NO_SUSPEND);
	if(status != NU_SUCCESS)
	{
		MessageBox(NULL,OpenFileErrorMsg[sPara.language][1],MB_OK);

		RestoreScreen(0,LCD_Y_SIZE,scrBuf);
		DestroyDiskData();
		DestroyUtf8();
		return 0;
	}	

	memset(viewBuf,0,DiskDataSize+1);
	status = NU_Allocate_Memory(&System_Memory,&cardPos,(MAX_CARD_NUM+1)*sizeof(INT),NU_NO_SUSPEND);
	if(status != NU_SUCCESS)
	{
		MessageBox(NULL,OpenFileErrorMsg[sPara.language][1],MB_OK);
		NU_Deallocate_Memory(viewBuf);
		RestoreScreen(0,LCD_Y_SIZE,scrBuf);
		DestroyDiskData();
		DestroyUtf8();

	}

	totalCard = GetCardNum();
	if(totalCard <= 0)
	{
		NU_Deallocate_Memory(viewBuf);
		NU_Deallocate_Memory(cardPos);
		DestroyDiskData();
		DestroyUtf8();
		RestoreScreen(0,LCD_Y_SIZE-1,scrBuf);
		return FALSE;
	}


	status = NU_Allocate_Memory(&System_Memory,&viewData,DiskDataSize+1,NU_NO_SUSPEND);
	if(status != NU_SUCCESS)
	{
		NU_Deallocate_Memory(viewBuf);
		NU_Deallocate_Memory(cardPos);
		DestroyDiskData();
		DestroyUtf8();
		RestoreScreen(0,LCD_Y_SIZE-1,scrBuf);
		return FALSE;

	}


GetViewData:

	disp = 1;
	dataLen = cardPos[cardInx+1]-cardPos[cardInx];
	memcpy(viewData,DiskData+cardPos[cardInx],dataLen);
	viewData[dataLen] = 0;
	totalLine = InitCardData(viewData);
	if(totalLine <= 1)
	{
		NU_Deallocate_Memory(viewBuf);
		NU_Deallocate_Memory(cardPos);
		NU_Deallocate_Memory(viewData);
		DestroyDiskData();
		DestroyUtf8();
		RestoreScreen(0,LCD_Y_SIZE-1,scrBuf);
		return FALSE;
	}


	startLine = 1;
	endLine = MAX_LINE+1;
	if(endLine > totalLine)
		endLine = totalLine;
	
	scrollFlag = 0;
	NU_Create_Timer(&cardTimer,"cardTimer",CardScrollLineEntry,0,10,40,NU_ENABLE_TIMER);

	while(1)
	{
		if(disp == 1)
		{
			disp = 0;
			scrollFlag = 0;

			BlockFill(0,0,LCD_X_SIZE-1,LCD_Y_SIZE-1,GRAY_SEVEN,1);

			//Always disp name
			i = 0;
			dispLen = MAX_CHAR;
			len = viewPos[i+1] - viewPos[i];
			ptr = viewBuf + viewPos[i];
			if(len >= dispLen)
			{
				len = CutViewBuf(ptr,dispLen);
				memcpy(lineBuf,ptr,len);
				lineBuf[len] = 0;
				Printf(2,viewLinePos[0],lineBuf,GRAY_SEVEN,TITLECOLOR);			
			}
			else
			{
				memcpy(lineBuf,ptr,len);
				lineBuf[len] = 0;
				len *= 12;
				len = (LCD_X_SIZE-4-len)/2 + 2;
				Printf(2+len,viewLinePos[0],lineBuf,GRAY_SEVEN,TITLECOLOR);			
			}
			for( i = startLine; i < endLine; i ++)
			{
				titleLen = strlen(viewTitle[i+1]);
				dispLen = MAX_CHAR - titleLen;
				len = viewPos[i+1] - viewPos[i];
				ptr = viewBuf + viewPos[i];
				if(len > dispLen)
				{
					len = CutViewBuf(ptr,dispLen);
				}
				memcpy(lineBuf,ptr,len);
				lineBuf[len] = 0;
				Printf(2,viewLinePos[i+1-startLine],viewTitle[i+1],GRAY_SEVEN,PURPLE);
				//Printf(2,viewLinePos[i+1-startLine],viewTitle[i+1],GRAY_SEVEN,CYAN);
				Printf(2+titleLen*12,viewLinePos[i+1-startLine],lineBuf,GRAY_SEVEN,BLACK);			
			}
			dispLine = startLine;
			ScrollCardLine(TRUE);			
		}

		key = GetKey();
		if(key == NEC_CANCEL)
			break;
		else if(key == NEC_RIGHT && endLine < totalLine)
		{
			startLine += MAX_LINE;
			endLine += MAX_LINE;
			if(endLine > totalLine)
				endLine = totalLine;
			disp = 1;
		}
		else if(key == NEC_LEFT && startLine > 1)
		{
			startLine -= MAX_LINE;
			endLine = startLine + MAX_LINE;
			disp = 1;
		}
		else if(key == NEC_DOWN)
		{
			if(dispLine < endLine -1)
			{
				ScrollCardLine(FALSE);
				dispLine ++;
				ScrollCardLine(TRUE);			
			}			
			else if(endLine < totalLine - 1)
			{
				startLine += MAX_LINE;
				endLine += MAX_LINE;
				if(endLine > totalLine)
					endLine = totalLine;
				disp = 1;
			}
		}
		else if(key == NEC_UP)
		{
			if(dispLine > startLine || dispLine == 1)
			{
				ScrollCardLine(FALSE);
				dispLine --;
				ScrollCardLine(TRUE);
			}
			else if(startLine > 1)
			{
				startLine -= MAX_LINE;
				endLine = startLine + MAX_LINE;
				disp = 1;
			}
		}
		else if(key == NEC_F1 && cardInx)// 上一人
		{
			ScrollCardLine(FALSE);
			NU_Delete_Timer(&cardTimer);
			cardInx --;
			goto GetViewData;
			
		}
		else if(key == NEC_F2 && cardInx < totalCard-1)
		{
			ScrollCardLine(FALSE);
			NU_Delete_Timer(&cardTimer);
			cardInx ++;
			goto GetViewData;
		}
	}

	ScrollCardLine(FALSE);
	NU_Delete_Timer(&cardTimer);

	NU_Deallocate_Memory(viewBuf);
	NU_Deallocate_Memory(cardPos);
	NU_Deallocate_Memory(viewData);
	DestroyDiskData();
	DestroyUtf8();
	RestoreScreen(0,LCD_Y_SIZE-1,scrBuf);
	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -