Added parsing arfcn's from cell description in SIT1.
diff --git a/include/grgsm/misc_utils/extract_system_info.h b/include/grgsm/misc_utils/extract_system_info.h
index d449cce..a05be18 100644
--- a/include/grgsm/misc_utils/extract_system_info.h
+++ b/include/grgsm/misc_utils/extract_system_info.h
@@ -57,6 +57,7 @@
       virtual std::vector<int> get_mcc() = 0;
       virtual std::vector<int> get_mnc() = 0;
       virtual std::vector<int> get_ccch_conf() = 0;
+      virtual std::vector<int> get_cell_arfcns(int chan_id) = 0;
       virtual std::vector<int> get_neighbours(int chan_id) = 0;
       virtual void reset() = 0;
     };
diff --git a/lib/misc_utils/extract_system_info_impl.cc b/lib/misc_utils/extract_system_info_impl.cc
index 73ce992..22e09aa 100644
--- a/lib/misc_utils/extract_system_info_impl.cc
+++ b/lib/misc_utils/extract_system_info_impl.cc
@@ -161,6 +161,27 @@
                 }
             }
         }
+        else if(msg_elements[2]==0x19)
+        { //System Information Type 1
+            memset(freq, 0, sizeof(freq));
+            chan_info info;
+            info.id = be16toh(header->arfcn);                            //take arfcn
+            info.pwr_db = header->signal_dbm;
+            boost::mutex::scoped_lock lock(extract_mutex);
+            //read cell arfcn's
+            gsm48_decode_freq_list(freq, &msg_elements[3], 16, 0x8c, 0x01);
+            if(d_c0_channels.find(info.id) != d_c0_channels.end()){
+                d_c0_channels[info.id].copy_nonzero_elements(info);
+            } else {
+                d_c0_channels[info.id] = info;
+            }
+            
+            for(int arfcn=0; arfcn<sizeof(freq); arfcn++){
+                if(freq[arfcn].mask==0x01){
+                    d_c0_channels[info.id].cell_arfcns.insert(arfcn);
+                }
+            }
+        }
     }
     
     std::vector<int> extract_system_info_impl::get_chans()
@@ -234,6 +255,15 @@
         }
         return neighbour_cells;
     }
+        
+    std::vector<int> extract_system_info_impl::get_cell_arfcns(int chan_id)
+    {
+        std::vector<int> cell_arfcns;
+        BOOST_FOREACH(int n, d_c0_channels[chan_id].cell_arfcns){
+            cell_arfcns.push_back(n);
+        }
+        return cell_arfcns;
+    }
     
     void extract_system_info_impl::reset()
     {
diff --git a/lib/misc_utils/extract_system_info_impl.h b/lib/misc_utils/extract_system_info_impl.h
index cd0b2b0..20f5adc 100644
--- a/lib/misc_utils/extract_system_info_impl.h
+++ b/lib/misc_utils/extract_system_info_impl.h
@@ -41,6 +41,7 @@
         unsigned int mnc;
         unsigned int ccch_conf;
         std::set<int> neighbour_cells;
+        std::set<int> cell_arfcns;
         
         chan_info() :  id(-1), pwr_db(0), arfcn(0), lac(0), cell_id(0), mcc(0), mnc(0), ccch_conf(-1){}
         chan_info(const chan_info & info) : id(info.id), pwr_db(info.pwr_db), arfcn(info.arfcn), lac(info.lac), cell_id(info.cell_id), mcc(info.mcc), mnc(info.mnc), ccch_conf(info.ccch_conf){}
@@ -89,6 +90,7 @@
       virtual std::vector<int> get_mcc();
       virtual std::vector<int> get_mnc();
       virtual std::vector<int> get_ccch_conf();
+      virtual std::vector<int> get_cell_arfcns(int chan_id);
       virtual std::vector<int> get_neighbours(int chan_id);
       virtual void reset();
       extract_system_info_impl();