コード例 #1
0
ファイル: Package.cs プロジェクト: renyh1013/dp2
		// 将通讯包转换为便于处理的行格式,放入m_LineArray中
		// 注意本函数需在LoadPackage()函数后使用。
		// 本函数把子包中的内容当作C语言字符串处理,将一个子包拆分为若干个字符串。
		// 返回-1表示失败。
		public int Parse(PackageFormat format)
		{
			Int32 lPackageLen;

			Int32 lBaoLen;
			Int32 lPathLen;
			int i;
			int wholelen,len;
			//char far *lpBao;
			//char far *lpPath;
			int j;
			Int32 lMask;
	
			// char *src = (char *)m_baPackage.GetData();

			Cell cell = null;
			int nOffs = 0;
			//byte [] baPath = null;
			//byte [] baBao = null;
			int nPathStart = -1;
			int nBaoStart = -1;
	
			this.Clear();
			ContinueString = "";
			ContinueBytes = null;

			lPackageLen =  BitConverter.ToInt32(m_baPackage, 0);

			Debug.Assert( lPackageLen == m_baPackage.Length,
				"包头部尺寸不正确");
	
//			pp = src + 4;
			nOffs += 4;
			Int32 lWholeLen = 4;
			for(i=0;;i++) 
			{
				lPathLen = BitConverter.ToInt32(m_baPackage, nOffs);

				Debug.Assert(lPathLen < 1000, "lPathLen不正确");

				// lpPath = pp + 4;
				nPathStart = nOffs + 4;
		
				nOffs += lPathLen;

				lWholeLen += lPathLen;

				if (lWholeLen >= lPackageLen)
					break;

				if (lWholeLen == lPackageLen) 
				{
					// 没有枚举部分
					lBaoLen = 0;
					lMask = 0;
				}
				else 
				{
					lBaoLen = BitConverter.ToInt32(m_baPackage, nOffs);
					lMask = BitConverter.ToInt32(m_baPackage, nOffs + 8);
				}

				if ((lMask & DtlpChannel.TypeBreakPoint) != 0) 
				{
					if (lBaoLen > 12) 
					{
						// lpBao = pp+12;

						len = strlen(m_baPackage, nOffs + 12) + 1;

						ContinueString = Encoding.GetEncoding(936).GetString(m_baPackage, nOffs+12, len-1);

						// 兼容模块
						ContinueBytes = new byte[len-1];
						Array.Copy(m_baPackage, nOffs+12, ContinueBytes, 0, len -1);

					}
					goto SKIP;
				}
		
				//lpBao = pp+12;  // 8
				if (lWholeLen == lPackageLen) 
					nBaoStart = -1;
				else 
					nBaoStart = nOffs + 12;

				// 将通讯包转换为以子包为单元的格式,放入m_LineArray中
				// 本函数不把子包中的内容当作C语言字符串处理。
				// 注意! pCell->ContentBytes中字符集未作转换(其它成员已经转换)。可能有以下几种形式:
				//	1)C语言字符串形式。DBCS/UTF8字符集。
				//	2)MARC记录。前面9字节为二进制内容,后面为C语言字符串。这样,就不能把整个ContentBytes
				//		当作一个字符串进行翻译,因为前面9字节中间可能包含0字符,将导致字符串终止。
				//		时间戳和MARC记录在一起的用法现在看来是一个大败笔。
				// 返回-1表示失败。

				if (format == PackageFormat.Binary) 
				{
					// lMask
					cell = new Cell();

					this.Add(cell);

					cell.Mask = lMask;
			
					if (lPathLen > 0 && m_baPackage[nPathStart] != 0) 
					{
						Debug.Assert(nPathStart!=-1,
							"nPathStart尚未初始化");

						Debug.Assert(strlen(m_baPackage, nPathStart) == lPathLen-4-1,
							"lPathLen值不正确");

						cell.Path += m_encoding.GetString(m_baPackage, nPathStart, lPathLen-4-1);
						cell.Lead += m_encoding.GetString(m_baPackage, nPathStart, lPathLen-4-1);

						/*
						// 最后一个字符不是'/'。即便为UTF8字符集,这里仍可以使用DBCS判断法。
						if (cell.Path.Length !=0
							&& cell.Path[Math.Max(0, cell.Path.Length-1)] != '/' )
							cell.Path += "/";
						*/

					}


					if (lWholeLen == lPackageLen) 
						break;

					if (lBaoLen <= 12)
						goto SKIP;

					// 枚举部分,当作一个整体
					Debug.Assert( lBaoLen >= 12 ,
						"lBaoLen不正确");

					if (lBaoLen > 12) // 正好== 12,不做
					{
						cell.ContentBytes  = new byte[lBaoLen - 12];

						Array.Copy(m_baPackage, nBaoStart, 
							cell.ContentBytes, 0, lBaoLen - 12);
					}

				}

				// nOffs += 12;

				if (lBaoLen <= 12)	
					goto SKIP;
		
				if (format == PackageFormat.String) 
				{
					for(len=0,wholelen=0,j=0;;j++) 
					{
			
						// lMask
						cell = new Cell();

						this.Add(cell);

						cell.Mask = lMask;
			
						if (lPathLen > 0 && m_baPackage[nPathStart] != 0) 
						{
							Debug.Assert(nPathStart!=-1,
								"nPathStart尚未初始化");

							Debug.Assert(strlen(m_baPackage, nPathStart) == lPathLen-4-1,
								"lPathLen值不正确");

							cell.Path += m_encoding.GetString(m_baPackage, nPathStart, lPathLen-4-1);
							cell.Lead += m_encoding.GetString(m_baPackage, nPathStart, lPathLen-4-1);

							// 最后一个字符不是'/'。即便为UTF8字符集,这里仍可以使用DBCS判断法。
							if (cell.Path.Length !=0
								&& cell.Path[Math.Max(0, cell.Path.Length-1)] != '/' )
								cell.Path += "/";

						}

						/*
						if (*lpPath) 
						{  // jia
							ASSERT(strlen(lpPath)==(unsigned int)lPathLen-4L-1L);
				
							if (nSrcCharset == CHARSET_UTF8) 
							{
								CAdvString advstrPath;
								advstrPath.SetString(lpPath,
									nSrcCharset == CHARSET_UTF8 ? _CHARSET_UTF8 : _CHARSET_DBCS);
								pCell->Path += (LPCTSTR)advstrPath; 
								pCell->Lead += (LPCTSTR)advstrPath;
							}
							else 
							{
								// DBCS时间优化,避免一次多余的复制
								pCell->Path += (LPCSTR)lpPath; 
								pCell->Lead += (LPCSTR)lpPath;
							}

				
							// 最后一个字符不是'/'。即便为UTF8字符集,这里仍可以使用DBCS判断法。
							if ( strlen(lpPath)!=0 && 
								*(lpPath+max(0,strlen(lpPath)-1))!='/' )
								pCell->Path += _T("/");
				
						}
						*/
			
						if (lBaoLen <= 12L) 
							break;



						len = strlen(m_baPackage, nBaoStart) + 1;

						cell.Path += m_encoding.GetString(m_baPackage, nBaoStart, len-1);
						cell.Content += m_encoding.GetString(m_baPackage, nBaoStart, len-1);


						wholelen += len;
						if (wholelen >= lBaoLen-12) // 8
							break;

						nBaoStart += len;
			
					}
				}


		
			SKIP:
				//pp+= lBaoLen;
				nOffs += lBaoLen;
		
				lWholeLen += lBaoLen;
				if (lWholeLen >= lPackageLen)
					break;
			}
	
			return i; // lTgtPos
		}