#include "..\inc\swilib.h"
#include "..\inc\cfg_items.h"
#include "conf_loader.h"

// §ª§Þ§á§à§â§ä §á§Ö§â§Ö§Þ§Ö§ß§ß§í§ç
extern const char cfgINTNAME[40];
extern const char cfgNAME[20];
extern const char cfgAPN[30];
extern const int ENA_GPRSD;
extern const char cfgUSER[20];
extern const char cfgPASS[20];
extern const unsigned int cfgTimeout;

// §±§å§ã§ä§í§ê§Ü§Ñ, §Ó§ã§Ö §á§à§Ý§ñ §Ù§Ñ§Ò§Ú§ä§í §ß§å§Ý§ñ§Þ§Ú
// §ª§ã§á§à§Ý§î§Ù§å§Ö§Þ §Õ§Ý§ñ §Ú§ß§Ú§è§Ú§Ñ§Ý§Ú§Ù§Ñ§è§Ú§Ú
const char profile_template[0x204] = {
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 
	0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00
};

// §©§Ñ§á§à§Ý§ß§ñ§Ö§ä §á§à§Ý§ñ §á§â§à§æ§Ú§Ý§ñ
// §£§ç§à§Õ - §å§Ü§Ñ§Ù§Ñ§ä§Ö§Ý§î §ß§Ñ §Ò§å§æ§Ö§â
// §£§í§ç§à§Õ - §Ò§å§æ§Ö§â §Ù§Ñ§á§à§Ý§ß§Ö§ß §ß§å§Ø§ß§í§Þ§Ú §Õ§Ñ§ß§ß§í§Þ§Ú
void FillProfile(char *profile)
{
  memcpy(profile, profile_template, 0x204); // Template => §ß§Ñ§ã§ä.§á§â§à§æ§Ñ§Û§Ý

  // §°§á§â§Ö§Õ§Ö§Ý§ñ§Ö§Þ §å§Ü§Ñ§Ù§Ñ§ä§Ö§Ý§Ú §ß§Ñ §á§à§Ý§ñ §á§â§à§æ§Ú§Ý§ñ
  char *apn_place = profile + coAPN_name;
  char *user_place = profile + coLogin;
  char *pass_place = profile + coPass;
  char *name_place= profile + coName;
  char *intname_place= profile + coIntName;
  unsigned int *timeout_place =(unsigned int*)(profile + coTimeout);
  
  // §©§Ñ§á§à§Ý§ß§ñ§Ö§Þ §Ú§ß§æ§à§â§Þ§Ñ§è§Ú§ð
  strcpy(intname_place, cfgINTNAME);
  strcpy(name_place, cfgNAME);
  strcpy(user_place, cfgUSER);
  strcpy(pass_place, cfgPASS);
  strcpy(apn_place, cfgAPN);
  memcpy(timeout_place, &cfgTimeout, 4);
//  ShowMSG(1,(int)cfgAPN);
}


// §©§Ñ§Ô§â§å§Ù§Ú§ä§î §Ü§à§ß§æ§Ú§Ô§å§â§Ñ§è§Ú§à§ß§ß§í§Û §æ§Ñ§Û§Ý §á§à §á§å§ä§Ú fname (§Ó§Ù§ñ§ä§à §Ú§Ù XTask)
// §¬§à§ß§æ§Ú§Ô§å§â§Ñ§è§Ú§à§ß§ß§í§Û §Ù§Ñ§Ô§â§å§Ù§é§Ú§Ü (c) Rst7
#pragma segment="CONFIG_C"
int LoadConfigData(const char *fname)
{
  int f;
  unsigned int ul;
  char *buf;
  int result=0;
  void *cfg;

  extern const CFG_HDR cfghdr0; //first var in CONFIG
  cfg=(void*)&cfghdr0;

  unsigned int len=(int)__segment_end("CONFIG_C")-(int)__segment_begin("CONFIG_C");

  if (!(buf=malloc(len))) return -1;
  if ((f=fopen(fname,A_ReadOnly+A_BIN,0,&ul))!=-1)
  {
    if (fread(f,buf,len,&ul)==len)
    {
      memcpy(cfg,buf,len);
      fclose(f,&ul);
    }
    else
    {
      fclose(f,&ul);
      goto L_SAVENEWCFG;
    }
  }
  else
  {
  L_SAVENEWCFG:
    if ((f=fopen(fname,A_ReadWrite+A_Create+A_Truncate,P_READ+P_WRITE,&ul))!=-1)
    {
      if (fwrite(f,cfg,len,&ul)!=len) result=-1;
      fclose(f,&ul);
    }
    else
      result=-1;
  }
  mfree(buf);
  return(result);
}

/*
  §£§à§Ù§Ó§â§Ñ§ë§Ñ§Ö§ä §ã§ä§â§à§Ü§å §Ó§Ú§Õ§Ñ CC-NC - §á§Ñ§â§Ñ§Þ§Ö§ä§â§í §ä§Ö§Ü§å§ë§Ö§Û §ã§Ö§ä§Ú §Ó §Ò§å§æ§Ö§â§Ö.
  §Ó§à§Ù§Ó§â§Ñ§ë§Ñ§Ö§ä 0, §¦§ã§Ý§Ú §ã§Ö§ä§Ú §ß§Ö §à§Ò§ß§Ñ§â§å§Ø§Ö§ß§à:)
*/
char get_net_id(char *buf)
{
  char *x = (char*)Get_CC_NC();
  char *y = x+1;
  char *z = x+2;
  char cc_2 = *x;
  char cc_1 = *y;
  // §¯§Ö§Þ§ß§à§Ô§à §Ø§×§ã§ä§Ü§à§Ô§à §ã§Ö§Ü§ã§Ñ §ã BCD...
  if(cc_1>=0xF0){cc_1 = cc_1 && 0x0F>>4;}
  cc_2 = (cc_2<<4) + (cc_2>>4);
  char nc = *z;
  nc = (nc>>4) + (nc<<4);
  if((nc == 0xFF)&&(cc_2==0xFF))
  {
    return 0;
  }
  // ... §Ú §Ù§à§Ý§à§ä§à§Û §Ü§Ý§ð§é§Ú§Ü §å §ß§Ñ§ã §Ó §Ü§Ñ§â§Þ§Ñ§ß§Ö )
  sprintf(buf, "%X%X-%02X", cc_2, cc_1, nc);
  return 1;
}


// §ª§ß§Ú§è§Ú§Ñ§Ý§Ú§Ù§Ñ§è§Ú§ñ §Ü§à§ß§æ§Ú§Ô§å§â§Ñ§è§Ú§Ú
// §¯§Ñ§Õ§à §Ó§í§Ù§Ó§Ñ§ä§î §Ó §ß§Ñ§é§Ñ§Ý§Ö §â§Ñ§Ò§à§ä§í §Õ§Ý§ñ §Ù§Ñ§Ô§â§å§Ù§Ü§Ú §Ü§à§ß§æ§Ú§Ô§å§â§Ñ§è§Ú§Ú
// §±§à§Ú§ã§Ü §Ü§à§ß§æ§Ú§Ô-§æ§Ñ§Û§Ý§Ñ §ã§à§Ô§Ý§Ñ§ã§ß§à §ã§ä§Ñ§ß§Õ§Ñ§â§ä§å
char config_name[128];

void InitConfig()
{
  char buf[10];
  if(!get_net_id((char*)&buf))
  {
    return;
  }
  sprintf(config_name,"0:\\ZBin\\etc\\GprsD_%s.bcfg", buf);
  //ShowMSG(1,(int)config_name);
  if(LoadConfigData(config_name)<0)
  {
    config_name[0] = '4';
    LoadConfigData(config_name);
  }
}

