📄 analysis.cpp
字号:
#include "stdafx.h"
#include "resource.h"
#include "GLOBAL.h"
PCHAR AnalysisHttpHeader(char *R)
{
int pos,len;
if ( Locate(R,"HTTP/1.1 503",0,0,0) )
{
lout("503 Service Temporarily Unavailable...\r\n选课服务器故障,请稍候再试...\r\n\r\n");
return 0;
}
if ( Locate(R,"HTTP/1.1 200 OK\r\n",0,&pos,0) )
{
R+=pos;
if ( Locate(R,"Set-Cookie: ","\r\n",&pos,&len))
{
RtlZeroMemory(UserCookie,sizeof(UserCookie));
lstrcpy(UserCookie,"Cookie: ");
R+=pos;
memcpy(UserCookie+8,R,len+2);
R+=pos;
#ifdef _DEBUG
lout(UserCookie);
#endif
}
if (Locate(R,"\r\n\r\n",0,&pos,0))
{
R+=pos;
}
if (Locate(R,"请您登录后再使用",0,0,0))
{
LogOFF("请您登录后再使用");
return 0;
}
else
{
return R;
}
}
return 0;
}
void Analysis1(char *R)
{
int pos,len,i;
LV_ITEM lvi;
char Buff[200];
//首先分析文件头
EnableDlgItem(hDlgQuery,IDC_PREVIOUS,false);
EnableDlgItem(hDlgQuery,IDC_NEXT,false);
SendMessage(hList1,LVM_DELETEALLITEMS,0,0);
RtlZeroMemory(&myget,sizeof(struct_get));
if ( Locate(R,"\"ctable\" VALUE=\"","\">",&pos,&len) )
{
R+=pos;
memcpy(&myget.ctable [0],R,len);
#ifdef _DEBUG
lout(&myget.ctable [0]);
#endif
R=R+len+2;
}
else
{
//没有找到ntable_type字段
}
if ( Locate(R,"\"ntable_type\" VALUE=\"","\">",&pos,&len) )
{
R+=pos;
memcpy(&myget.ntable_type [0],R,len);
#ifdef _DEBUG
// lout(&myget.ntable_type [0]);
#endif
R=R+len+2;
}
else
{
//没有找到ctable字段
}
if ( Locate(R,"\"ccolumns\" VALUE=\"","\">",&pos,&len) )
{
R+=pos;
memcpy(&myget.ccolumns [0],R,len);
#ifdef _DEBUG
// lout(&myget.ccolumns [0]);
#endif
R=R+len+2;
}
else
{
//没有找到ccolumns字段
}
if ( Locate(R,"\"cclauses\" VALUE=\"","\">",&pos,&len) )
{
R+=pos;
memcpy(&myget.cclauses [0],R,len);
#ifdef _DEBUG
// lout(&myget.cclauses [0]);
#endif
R=R+len+2;
}
else
{
//没有找到ccolumns字段
}
if ( Locate(R,"\"nrow_min\" VALUE=\"","\">",&pos,&len) )
{
R+=pos;
memcpy(&myget.nrow_min [0],R,len);
#ifdef _DEBUG
// lout(&myget.nrow_min [0]);
#endif
R=R+len+2;
}
else
{
//没有找到nrow_min字段
}
if ( Locate(R,"\"nrow_max\" VALUE=\"","\">",&pos,&len) )
{
R+=pos;
memcpy(&myget.nrow_max [0],R,len);
#ifdef _DEBUG
// lout(&myget.nrow_max [0]);
#endif
R=R+len+2;
}
else
{
//没有找到nrow_max字段
}
if ( Locate(R,"<-前纪录",0,&pos,0))
{
R+=pos;
EnableDlgItem(hDlgQuery,IDC_PREVIOUS,true);
}
if ( Locate(R,"<TH>课程属性</TH>",0,&pos,0) )
{
R+=pos; //此时停在<td 这儿
}
else
{
//没有找到课程
}
if ( Locate(R,"No data found",0,&pos,0) )
{
MessageBox(0,"没有此门课",szTitle,MB_ICONINFORMATION);
return;
//没有此门课
}
RtlZeroMemory(&lvi,sizeof(LV_ITEM));
lvi.mask=LVIF_TEXT;
lvi.pszText=Buff;
lvi.cchTextMax=sizeof(Buff);
AGAIN1:
lvi.iSubItem=0;
Buff[0]=0;
// lvi.iItem=SendMessage(hList1,LVM_GETITEMCOUNT,0,0);
i=SendMessage(hList1, LVM_INSERTITEM,0, (long)&lvi);
/* if (now_http_head==&http_head2)
{
i=0;
}
else
{
i=1;
}*/
for (i=1;i<13;i++)
{
RtlZeroMemory(Buff,sizeof(Buff));
if ( Locate(R,"<TD ALIGN=\"LEFT\">","</TD>",&pos,&len) )
{
R+=pos;
memcpy(Buff,R,len);
R=R+len+5;
SendMessage(hList1, LVM_SETITEM,0, (long)&lvi);
}
else
{
}
lvi.iSubItem++;
}
/* if (IsDlgButtonChecked(hDlgQuery,IDC_FILTER_AVAILABLE)==BST_CHECKED)
{
RtlZeroMemory(Buff,10);
lvi.iSubItem=9;
if (now_http_head==&http_head2) lvi.iSubItem++;
SendMessage(hList1,LVM_GETITEMTEXT,lvi.iItem,(long)&lvi);
i=atoi(Buff);
if (i==0)
{
SendMessage(hList1,LVM_DELETEITEM,lvi.iItem,0);
lvi.iItem--;
}
}*/
//-------------是否还有下一条记录------------------
if ( Locate(R,"</TR>\n<TR>",0,&pos,0) )
{
R+=pos;
lvi.iItem++;
//lvi.lParam++;
goto AGAIN1;
}
else
{
RtlZeroMemory(Buff,10);
i=SendMessage(hList1,LVM_GETITEMCOUNT,0,0);
if (i>20 || IsDlgButtonChecked(hDlgQuery,IDC_FILTER_AVAILABLE)==BST_CHECKED)
{
lstrcpy(Buff,"共有");
_itot(i,&Buff[4],10);
lstrcat(Buff,"条记录");
MessageBox(0,Buff,szTitle,MB_ICONINFORMATION);
}
}
SetDlgItemText(hDlgQuery,IDC_QUERY_ALL,"任选课");
SetDlgItemText(hDlgQuery,IDC_ALL_PE,"体育课");
SetDlgItemText(hDlgQuery,IDC_ALL_COMPUTER,"计算机课");
if ( Locate(R,"后纪录->",0,&pos,0))
{
R+=pos;
EnableDlgItem(hDlgQuery,IDC_NEXT,true);
}
}
void Analysis2(char *R)
{
int pos,len,row=0,i;
LV_ITEM lvi;
char Buff[50];
if ( Locate(R,"因学生不足,以下所选课程被取消",0,&pos,0))
{
R+=pos;
}
else
{
MessageBox(0,"无法分析停课信息",0,MB_ICONERROR);
return;
}
SendMessage(hList2,LVM_DELETEALLITEMS,0,0);
if ( Locate(R,"教师名</td></tr>",0,&pos,0))
{
R+=pos;
}
else
{
MessageBox(0,"没有停课信息",0,MB_ICONINFORMATION);
return;
}
lvi.mask=LVIF_TEXT;
lvi.pszText=Buff;
AGAIN2:
lvi.iItem=row;
lvi.lParam=row;
if ( Locate(R,"<tr><td>",0,&pos,0)) //还有停课信息
{
R+=pos;
}
else
{
return;
}
//----课程号----------------
RtlZeroMemory(Buff,sizeof(Buff));
memcpy(Buff,R,7);
lvi.iSubItem=0;
SendMessage(hList2, LVM_INSERTITEM,0, (long)&lvi);
R+=7;
//----课程名,课序号,开课系所,课程属性----------------
for (i=0;i<4;i++)
{
lvi.iSubItem++;
if ( Locate(R,"</td><td>","</td><td>",&pos,&len))
{
R+=pos;
RtlZeroMemory(Buff,sizeof(Buff));
memcpy(Buff,R,len);
R=R+len;
}
SendMessage(hList2, LVM_SETITEM,0, (long)&lvi);
}
//----教师名----------------
lvi.iSubItem++;
if ( Locate(R,"</td><td>","</td></tr>",&pos,&len))
{
R+=pos;
RtlZeroMemory(Buff,sizeof(Buff));
memcpy(Buff,R,len);
R=R+len+10;
}
SendMessage(hList2, LVM_SETITEM,0, (long)&lvi);
//是否还有下一条记录
if ( Locate(R,"<tr><td>",0,&pos,0))
{
row++;
goto AGAIN2;
}
}
void Analysis3(char *R)
{
/* int pos,len,i,j,k,row=0;
bool aDelKch,mode=false;
char Buffer[1000];
char Name[20];
char *B=Buffer;
//LV_ITEM lvi;
//清除所有IDD_CHOOSEBOX上的窗口
for (i=0;i<MAX_COURSE+8;i++)
{
if (CW2[i])
{
DestroyWindow(CW2[i]);
CW2[i]=0;
}
}
for (i=0;i<MAX_COURSE;i++)
for (j=0;j<COLUMN_COUNT;j++)
if (CW[i][j])
{
DestroyWindow(CW[i][j]);
CW[i][j]=0;
}
RtlZeroMemory(KW,sizeof(KW));
RtlZeroMemory(KW2,sizeof(KW2));
//首先是上半部分
if (Locate(R,"你目前没有权限选课",0,0,0) || Locate(R,"现在不是选课时间",0,0,0))
{
MessageBox(0,"对不起,现在不是选课时间",szTitle,MB_ICONWARNING);
return;
}
if (!Locate(R,"<TH>是否服从调剂</TH>",0,&pos,0))
{
if (!Locate(R,"<TH>上课周次</TH>",0,&pos,0))
{
MessageBox(0,"对不起,课程选择数据有误",szTitle,MB_ICONERROR);
return;
}
else
{
mode=true;
R+=pos;
}
}
else
{
R+=pos;
}
while (true)
{
B=Buffer;
if (Locate(R,"aDelCourse value=",0,&pos,0))
{
R+=pos;
memcpy(&KW2[row][0],R,9);
}
RtlZeroMemory(Buffer,sizeof(Buffer));
for (i=0;i<10-mode;i++)
{
if (Locate(R,"<TD>","</TD>",&pos,&len))
{
R+=pos;
if (len)
{
while ((*R)=='<')
{
Locate(R,">","<",&pos,&len);
R+=pos;
}
memcpy(B,R,len);
B+=len;
memcpy(B," ",3);
B+=3;
R=R+len+5;
}
}
}
if (!memcmp(B-9," ",6))
{
*(B-12)=0;
}
if (!memcmp(B-5,"是",2))
{
*(B-3)=0;
}
CW2[row]=CreateWindowEx(0,"button",Buffer, WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX |BS_MULTILINE , 20, 60+20*row, 1000, 20, hDlgChoose, NULL, hInst, NULL);
SendMessage(CW2[row],WM_SETFONT,(unsigned int)hFont,1);
row++;
if (row>MAX_COURSE)
{
MessageBox(0,"对不起,数据有误,无法继续分析",szTitle,MB_ICONWARNING);
return;
}
//注意,在Unix上比R+1中间是\n,在Windows上比R+2中间是\r\n
//if ( !wmemcmp(R+2,"</TR>\r\n</TABLE>",15*sizeof(char)) ) break;
if ( !memcmp(R+1,"</TR>\n</TABLE>",14) ) break;
}
// MessageBox(0,"上半部分完成",0,0);
//下半部分
if (mode) goto finish_analysis3;
if (Locate(R,"<TH>第五志愿</TH>",0,&pos,0))
{
R+=pos;
}
else
{
MessageBox(0,"对不起,课程选择数据有误",szTitle,MB_ICONERROR);
return;
}
j=0;//j用于存放CW此时的row号,而变量row用于计算cw[0][*]的height属性
while (true)
{
B=Buffer;
RtlZeroMemory(Buffer,sizeof(Buffer));
//找到下一个课程的开始处
// if (Locate(R,"<tr>",0,&pos,0))
// R+=pos;
//第一个AutoCheckBox跳过
if (Locate(R,"<TD>","</TD>",&pos,&len))
{
R+=pos;
if (*R=='&')) aDelKch=false;
if (*R=='<')) aDelKch=true;
}
//课程属性、课序号、课程名、限制说明
for (i=0;i<4;i++)
{
if (Locate(R,"<TD>","</TD>",&pos,&len))
{
R+=pos;
while ((*R)=='<'))
{
Locate(R,">","<",&pos,&len);
R+=pos;
}
memcpy(B,R,len);
if (i==0) //课程属性
{
if (memcmp(R,"必修",4)==0)
{
KW[j][8]='1');
}
else if (memcmp(R,"限选",4)==0)
{
KW[j][8]='2');
}
else if (memcmp(R,"任选",4)==0)
{
KW[j][8]='3');
}
}
if (i==2) //课程号
{
memcpy(&KW[j][0],R,7);
//lout(&KW[j][0]);
//lout("\r\n";
}
if (i==3) continue;
B+=len;
memcpy(B," ",3);
B+=3;
R=R+len+5;
}
}
//是否取消
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -